代码之家  ›  专栏  ›  技术社区  ›  Serhat Ozgel

是否可以在pl-sql中参数化查询?

  •  1
  • Serhat Ozgel  · 技术社区  · 16 年前

    此处正在写入的存储过程当前将参数指定给查询:

       SELECT * 
         FROM Names 
        WHERE Name = ' || prmName || ' 
     ORDER BY ' || prmSortField
    

    是否可以在存储过程中参数化此查询?可能像:

    query = 'select * From Names Where Name = @name Order By ' || prmSortField
    call(query, prmName)
    

    注:
    如果您想知道为什么要这样做,我们的SP有两个常见参数: sortFieldIndex sortDirection .因为我们不能直接参数化这些,所以查询是动态生成的。但是其他参数会使查询打开进行注入。所以我正在寻找一种方法来参数化一些参数。

    3 回复  |  直到 16 年前
        1
  •  4
  •   cletus    16 年前

    当然。使用 cursors .

    DECLARE
      CURSOR c1 (job VARCHAR2, max_wage NUMBER) IS
        SELECT * FROM employees WHERE job_id = job AND salary > max_wage;
    BEGIN
      FOR person IN c1('CLERK', 3000)
      LOOP
         -- process data record
        DBMS_OUTPUT.PUT_LINE('Name = ' || person.last_name || ', salary = ' ||
                             person.salary || ', Job Id = ' || person.job_id );
      END LOOP;
    END;
    
        2
  •  4
  •   Tony Andrews    16 年前

    对于具有绑定值的动态查询,请执行以下操作:

    procedure p (prmName varchar2, prmSortField varchar2)
    is
        query varchar2(100);
        rc sys_refcursor;
        names_rec names%rowtype;
    begin
        query = 'select * From Names Where Name = :name Order By ' || prmSortField
        open rc for query using prmName;
        loop
            fetch rc into names_rec;
            exit when rc%notfound;
            -- process this row
        end loop;
        close rc;
    end;
    
        3
  •  -1
  •   Stew S    16 年前

    有关支持可选参数值(但使用sys上下文)的更详细的过程,请查看asktom.com上的以下文章

    PRATTY -- Thanks for the question regarding 'CURSOR'...