繁体   English   中英

Oracle存储过程查询无法使用游标

[英]Oracle stored procedure query like not working with cursor

我是oracle新手,并尝试使用以下pl / sql代码创建存储过程。

代码有什么问题?当我用硬代码值“ 1605%”替换searchString时,将执行查询,但不使用变量。

create or replace PACKAGE BODY MAT_INFO AS

  PROCEDURE mat_details(mat_id IN varchar, mat_cur OUT SYS_REFCURSOR) AS

  searchString varchar2(700);
  BEGIN

    searchString := ''''||mat_id||'%''';
    OPEN mat_cur FOR SELECT mi.* FROM S_JAMM_MAT_INFO mi WHERE mi.MAT_ID LIKE searchString;
  END mat_details;

END MAT_INFO;

有人可以帮我在这里做错什么吗?

谢谢

您正在使用不必要的引号:

SQL> declare
  2      mat_id        varchar2(100) := 'X';
  3      searchString  varchar2(100) := ''''||mat_id||'%''';
  4      searchString2 varchar2(100) := ''||mat_id||'%';
  5      num number;
  6  begin
  7      select count(1)
  8      into num
  9      from dual
 10      where 'X' like searchString;
 11      --
 12      dbms_output.put_line('1. num= ' || num);
 13      --
 14      select count(1)
 15      into num
 16      from dual
 17      where 'X' like searchString2;
 18      --
 19      dbms_output.put_line('2. num= ' || num);
 20  end;
 21  /
1. num= 0
2. num= 1

PL/SQL procedure successfully completed.

SQL>

如果您要使用动态SQL,则双引号可能会很有用,但是在静态查询中,这意味着您要查找包含引号作为字符串一部分的模式。

create or replace PACKAGE BODY MAT_INFO AS
  PROCEDURE mat_details(
    i_mat_id  IN  varchar,
    mat_cur   OUT SYS_REFCURSOR
  )
  AS
  BEGIN
    OPEN mat_cur FOR
      SELECT *
      FROM   S_JAMM_MAT_INFO
      WHERE  MAT_ID LIKE i_mat_id || '%';
  END mat_details;
END MAT_INFO;
/

您可以尝试更改以下步骤。

CREATE OR REPLACE PACKAGE BODY MAT_INFO AS

  PROCEDURE MAT_DETAILS(MAT_ID IN VARCHAR, MAT_CUR OUT SYS_REFCURSOR) AS

  SEARCHSTRING VARCHAR2(700);
  CURSOR MAT_CUR (SEARCHSTRING VARCHAR) IS 
    SELECT MI.* FROM S_JAMM_MAT_INFO MI WHERE MI.MAT_ID LIKE SEARCHSTRING;

  BEGIN


    FOR DATA IN MAT_CUR(MAT_ID)
    LOOP
        --YOUR CODE 
    END LOOP;

  END MAT_DETAILS;

END MAT_INFO;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM