sql >> Databasteknik >  >> RDS >> Oracle

Oracle PL/SQL - Hur man undslipper kolon (:), misstolkas för bindningsvariabel

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;


  1. Hur kan jag vända på standardordningen i MySQL?

  2. Förstå ACID-modellen för databashantering

  3. Tidsskillnad mellan slutdatum för första poster till nästa post första datum

  4. HTML - ändra färg i textområdet från ett alternativ inuti en markeringsruta genererad från mysql