2014-01-12 94 views
0

我碰到與動態SQL麻煩,我希望能夠以顯示部門標識:動態SQL | PL/SQL

CREATE OR REPLACE PROCEDURE pro_two_tables 
    (p_input VARCHAR2) IS 
    v_department_id employees.department_id%TYPE; 

BEGIN 
    EXECUTE IMMEDIATE 
     'SELECT department_id 
    /* MYSTERY FOR ME */ 
      FROM ' || p_input || ' 
       WHERE manager_id = 205'; 
DBMS_OUTPUT.PUT_LINE('You selected ID from the table' || ' ' || p_input || ' ' || 'ID is' ||' ' || v_department_id); 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('No data found'); 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE(' I petty the fool who wrote this'); 
END; 

我似乎無法理解怎麼會得到一個使用「INTO」子句在這個過程中。 我正在讀這個問題,並做一些「測試」,雖然我相信這是很大的幫助 如果有人可以向我解釋這一點。

回答

1

的INTO去後面在

declare 
    foo number; 
    bar number; 

begin 
    execute immediate 'select 1,2 from dual' into foo, bar; 
    dbms_output.put_line(foo ||','||bar); 
end; 
/

這將打印執行直接:

1,2 

請注意,如果您發現youeself使用動態SQL,它往往是一個好主意,檢查你的設計。

+0

謝謝你,我還以爲我試了一下,但大多數做了一些錯誤,而「努力」吧,現在它工作,歡呼。 – Novice

0
CREATE OR REPLACE PROCEDURE pro_two_tables (i_table_name VARCHAR2) 
IS 
    v_record_id  NUMBER; 
    v_record_name VARCHAR2 (500) := 'Name Record'; -- Insert your Name Value 
    sql_stmt  VARCHAR2 (500); 
BEGIN 
    sql_stmt := 
     'SELECT id 
      FROM ' || i_table_name || ' WHERE name = :1'; 

    EXECUTE IMMEDIATE sql_stmt INTO v_record_id USING v_record_name; 

    DBMS_OUTPUT.PUT_LINE( 'You selected ID from the table' 
         || ' ' 
         || i_table_name 
         || ' ' 
         || 'ID is' 
         || ' ' 
         || v_record_id); 
EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN 
     DBMS_OUTPUT.PUT_LINE ('No data found'); 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.PUT_LINE (' I petty the fool who wrote this'); 
END; 

支持Execute立即可以使用:

  1. 成返回單值O BULK收進的多值。
  2. 使用替代綁定變量在你的查詢語句,你在你的SQL將與格式:[name_field]