Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle PL / SQL - Cách thoát dấu hai chấm (:), bị hiểu sai cho biến liên kết

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 spooldbms_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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn dữ liệu sau khi tạo chỉ mục trên bảng trống hay tạo chỉ mục duy nhất sau khi chèn dữ liệu trên oracle?

  2. C # gọi hàm lưu trữ oracle

  3. Làm thế nào để kiểm tra xem tệp có tồn tại trong PL / SQL hay không?

  4. Làm thế nào để truy vấn này có thể được cải thiện?

  5. Làm cách nào để gỡ cài đặt hoàn toàn oracle 11g?