sql >> データベース >  >> RDS >> Oracle

Oracle PL / SQL-バインド変数と誤って解釈されているコロン(:)をエスケープする方法

    位置変数を割り当てるときは、位置変数を引用符で囲む必要があるため、値全体がその時点で文字列として解釈されます。

    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;
    


    1. PHPはデータベースから画像を表示します

    2. MySQL Clusterは、SELECTクエリを検索するデータノードをどのように決定しますか?

    3. SQLite JSON_GROUP_OBJECT()

    4. PHP:mysql_connectがFALSEを返さない