繁体   English   中英

动态SQL | PL / SQL

[英]Dynamic SQL | PL/SQL

我在使用动态SQL时遇到了麻烦,我希望能够显示department_id:

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”子句。 我正在阅读有关此问题的内容并进行一些“测试”,尽管我相信如果有人可以向我解释这一点将对您有很大帮助。

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

请注意,如果您使用动态SQL找到自己,那么通常回顾一下设计是一个好主意。

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;

使用立即执行,您可以使用:

  1. 返回单个值的INTO o批量收集多个值的INTO。
  2. 用于替换放置在sql中的查询语句中的绑定变量,格式为:[name_field]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM