[英]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.