通过将表名作为PL / SQL中的参数传递来从表中搜索数据

时间:2012-02-07 11:29:06

标签: oracle plsql oracle9i

通过将表名作为参数

传递,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;

1 个答案:

答案 0 :(得分:1)

如果您需要此过程,那么我猜您有几个包含bankcodebanknamedist_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例外情况?