位置変数を割り当てるときは、位置変数を引用符で囲む必要があるため、値全体がその時点で文字列として解釈されます。
destination_connstring VARCHAR(20) := '&6';
PL / SQL変数の割り当てが、LIKE
という意味でのエスケープをサポートしているとは思いません。 そうであれば、スクリプトを呼び出す前に入力を変更する必要がありますが、これは理想的ではありません。
元の質問から少し離れて...
また、渡されたパラメーターとカーソル値に基づいてアクションを実行するには、何らかの形式の動的SQLを使用する必要があります。およびCOPY
はSQL*Plusコマンドであるため、PL/SQLから呼び出すことはできません。 PL / SQLブロックを使用して、spool
を介して、すべてのコマンドを含む個別のSQLスクリプトを生成することをお勧めします。 およびdbms_output
、ブロックが完了した後に実行します。次のようなもの:
SET SERVEROUTPUT ON SIZE 100000 FORMAT WRAPPED;
SET TRIMOUT ON
SET TRIMSPOOL ON
SET VERIFY OFF
SET LINES 1024
SPOOL tmp_copy_commands.sql
SET TERMOUT OFF
SET FEEDBACK OFF
DECLARE
src_username VARCHAR2(20) := '&1';
src_password VARCHAR2(20) := '&2';
src_connstring VARCHAR2(40) := '&3';
dest_username VARCHAR2(20) := '&4';
dest_password VARCHAR2(20) := '&5';
dest_connstring VARCHAR(40) := '&6';
CURSOR user_table_cur IS
SELECT table_name
FROM user_tables
ORDER BY table_name DESC;
BEGIN
FOR user_table IN user_table_cur LOOP
dbms_output.put_line('COPY FROM '
|| src_username ||'/'|| src_password ||'@'|| src_connstring
|| ' TO '
|| dest_username ||'/'|| dest_password ||'@'|| dest_connstring
|| ' APPEND ' || user_table.table_name
|| ' USING SELECT * FROM '
|| user_table.table_name ||';');
END LOOP;
END;
/
SPOOL OFF
SET TERMOUT ON
SET FEEDBACK ON
@tmp_copy_commands
EXIT 0;
元の質問からさらに離れて...
動的SQLとEXECUTE IMMEDIATE
を使用する場合を除いて、これにPL/SQLを使用する必要はありません。 。これは前の例と同じようになります:
SET TRIMOUT ON
SET TRIMSPOOL ON
SET VERIFY OFF
SET LINES 1024
SET PAGES 0
SET HEAD OFF
SPOOL tmp_copy_commands.sql
SET TERMOUT OFF
SET FEEDBACK OFF
SELECT 'COPY FROM &1./&[email protected]&3. TO &4./&[email protected]&6. APPEND '
|| table_name || ' USING SELECT * FROM ' || table_name || ';'
FROM user_tables
ORDER BY table_name DESC;
SPOOL OFF
SET TERMOUT ON
SET FEEDBACK ON
@tmp_copy_commands
exit 0;