我需要编写一个动态接受列名和列值的存储过程,并动态返回与列值匹配的整行。
帮我写这个!!
由于
答案 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等。那么你不需要担心字符串表示(例如小数分隔符和日期格式)。