2014-01-12 37 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]