当我们动态传递列名的值和plsql中的相应列值时,存储过程以获取整行

时间:2017-07-16 12:55:50

标签: oracle plsql dynamic-sql

我需要编写一个动态接受列名和列值的存储过程,并动态返回与列值匹配的整行。

帮我写这个!!

由于

2 个答案:

答案 0 :(得分:0)

首先,我创建一个采用列及其值

的过程
CREATE OR replace PROCEDURE Exec_query (column1 IN VARCHAR2,
                                                   value1  IN VARCHAR2,
                                                   row_out OUT hr.employees%ROWTYPE)
           IS
             query VARCHAR2(4000) := 'select * FROM EMPLOYEES WHERE '
                                     || column1
                                     || '='
                                     || value1;
             c1    SYS_REFCURSOR;
           BEGIN
               OPEN c1 FOR query;

               FETCH c1 INTO row_out;
           END;

           /

这里我获取employee_id = 100的员工记录并显示first_name。使用concat运算符“||”编写其他列在dbms_output.put_line()

           SET SERVEROUTPUT ON;
           DECLARE
               v_emp_row employees%ROWTYPE;
           BEGIN
               Exec_query('employee_id', '100', v_emp_row);

               dbms_output.Put_line(v_emp_row.first_name);
           END;

           /  

答案 1 :(得分:0)

出于性能和安全原因,您应该使用绑定变量。

CREATE OR REPLACE FUNCTION GET_ROW_BY_EXAMPLE
      (column1 IN VARCHAR2,
          value1  IN VARCHAR2) 
 RETURN dual%ROWTYPE IS
      result dual%ROWTYPE;
BEGIN
    EXECUTE IMMEDIATE 
         'SELECT * FROM dual WHERE ' || column1 || ' = :value1'
         INTO result
         USING IN value1;
    return result;
END;

我建议您检查一下column1。在将表传递给字符串文字之前,它包含表的有效列名。另请注意,如果value1非唯一且查询返回两行,则不会出现错误处理。

将它放入一个包并重载函数是非常好的,所以你有一个值为1的VARCHAR2,一个是NUMBER,一个是DATE等。那么你不需要担心字符串表示(例如小数分隔符和日期格式)。