Du måste sätta citattecken runt positionsvariabeln när du tilldelar den, så hela värdet tolkas som en sträng vid den punkten:
destination_connstring VARCHAR(20) := '&6';
Jag tror inte att PL/SQL-variabeltilldelning stöder escape i den meningen att LIKE
gör det, och om det gjorde det skulle du behöva ändra dina inmatningar innan du anropade skriptet, vilket inte skulle vara idealiskt.
Går lite ifrån din ursprungliga fråga...
Du måste också använda någon form av dynamisk SQL för att vidta åtgärder baserat på angivna parametrar och markörvärden; och COPY
är ett SQL*Plus-kommando så du kan inte anropa det från PL/SQL ändå. Jag skulle föreslå att du använder PL/SQL-blocket för att generera ett separat SQL-skript som innehåller alla kommandon, via spool
och dbms_output
, som du sedan kör efter att blocket är klart. Något i stil med:
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;
Går ännu längre bort från din ursprungliga fråga...
Du behöver inte ens använda PL/SQL för detta, såvida du inte vill använda dynamisk SQL och EXECUTE IMMEDIATE
. Detta kommer att göra samma sak som det tidigare exemplet:
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;