【问题标题】:Oracle stored procedure query like not working with cursorOracle 存储过程查询,例如不使用游标
【发布时间】:2016-06-01 21:14:50
【问题描述】:

我是 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;

谁能帮我在这里做错了什么?

谢谢

【问题讨论】:

  • 您是否尝试调试过程序,您的程序似乎没问题,需要在运行时检查值。使用 TOAD 或任何其他可以调试的工具。调试时使用 DBMS_OUTPUT.put_line (searchstring)
  • DBMS_OUTPUT.Put_Line('SELECT mi.* FROM S_JAMM_MAT_INFO mi WHERE mi.MAT_ID LIKE '|| searchString);我在输出窗口中得到以下输出:SELECT mi.* FROM S_JAMM_MAT_INFO mi WHERE mi.MAT_ID LIKE '1605310%'
  • 我正在使用oracle sql developer

标签: oracle plsql


【解决方案1】:

您使用了不必要的引号:

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,双引号可能会很有用,但在静态查询中,这意味着您正在寻找包含引号的模式作为要查找的字符串的一部分。

【讨论】:

  • 谢谢。有效。当我在查询窗口中运行查询时,它与“test%”一起工作,所以我想,我需要在存储过程中额外引用。它如何在没有附加引号的存储过程中工作?
  • 我认为这与大多数其他语言相同。如果您想使用参数p_empname 指定一个名为“SMITH”的员工,您可以编写where e.empname = p_empname,而无需用引号括起来。
【解决方案2】:
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;
/

【讨论】:

    【解决方案3】:

    您可以尝试如下更改程序。

    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;
    

    【讨论】:

    • OP 正在返回光标而不是在过程中处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2023-02-05
    相关资源
    最近更新 更多