通过将表名作为参数
传递,oracle中的这个存储过程对于从表中搜索数据是否正确CREATE OR REPLACE PROCEDURE bank_search_sp
(
p_tablename IN VARCHAR2,
p_searchname IN VARCHAR2,
p_bankcode OUT VARCHAR2,
p_bankname OUT VARCHAR2,
p_dist_code OUT NUMBER
)
AS
v_tem VARCHAR2(5000);
BEGIN
v_tem := 'SELECT bankcode,bankname,dist_code FROM ' || UPPER (p_tablename) || '
WHERE bankname LIKE '''|| p_searchname||'''';
EXECUTE IMMEDIATE v_tem
INTO p_bankcode,p_bankname,p_dist_code
USING p_searchname ;
END bank_search_sp;
答案 0 :(得分:1)
如果您需要此过程,那么我猜您有几个包含bankcode
,bankname
和dist_code
列的表格。如果这是真的,那么尽可能将模型标准化。
USING
术语是正确的方法,但您必须在查询中使用该参数。
为避免SQL注入,您可以使用dbms_assert.sql_object_name
。
这应该适合你:
v_tem := 'SELECT bankcode, bankname, dist_code FROM '
|| dbms_assert.sql_object_name(p_tablename)
|| ' WHERE bankname LIKE :1';
您的EXECUTE IMMEDIATE
会在找不到行或多行时抛出异常,因此使用LIKE
可能不是一个好主意。
你应该问自己的问题:
LIKE
,还是=
您想要的是什么?LIKE
,该计划应如何处理NO_DATA_FOUND
/ TOO_MANY_ROWS
例外情况?