Bạn cần đặt dấu ngoặc kép xung quanh biến vị trí khi bạn gán nó, vì vậy toàn bộ giá trị được hiểu là một chuỗi tại thời điểm đó:
destination_connstring VARCHAR(20) := '&6';
Tôi không tin rằng việc gán biến PL / SQL hỗ trợ thoát theo nghĩa là LIKE
và nếu có, bạn phải sửa đổi đầu vào của mình trước khi gọi tập lệnh không lý tưởng.
Di chuyển khỏi câu hỏi ban đầu của bạn một chút ...
Bạn cũng sẽ cần sử dụng một số dạng SQL động để thực hiện hành động dựa trên các tham số và giá trị con trỏ đã truyền; và COPY
là một lệnh SQL * Plus nên bạn không thể gọi nó từ PL / SQL. Tôi khuyên bạn nên sử dụng khối PL / SQL để tạo một tập lệnh SQL riêng chứa tất cả các lệnh, thông qua spool
và dbms_output
, sau đó bạn sẽ thực thi sau khi khối hoàn thành. Một cái gì đó như:
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;
Đi xa hơn nữa so với câu hỏi ban đầu của bạn ...
Bạn thậm chí không cần sử dụng PL / SQL cho việc này, trừ khi bạn muốn sử dụng SQL động và EXECUTE IMMEDIATE
. Điều này sẽ thực hiện tương tự như ví dụ trước đó:
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;