离散事件,
我到处都搜索过,但我找不到解决这个简单问题的方法。
情况:
我需要编写一个过程,其中以列名作为输入,并将该列中存在的所有不同值作为输出返回。然后我必须在一些c#代码中使用此过程。
在MS服务器中,它非常简单,因为它将直接提供与PL / SQL不同的结果集。
我可以写的脚本(这不是给我我需要的结果):
CREATE OR REPLACE
PROCEDURE GetCol(PARAM IN STRING, recordset OUT sys_refcursor)
AS
BEGIN
OPEN recordset FOR
SELECT DISTINCT(PARAM)
FROM my_table;
END
当我尝试使用以下代码检查记录集中的数据时:
DECLARE
l_cursor SYS_REFCURSOR;
l_sname VARCHAR2(50);
BEGIN
GetCol('col_name',l_cursor);
LOOP
FETCH l_cursor INTO l_sname;
EXIT WHEN l_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_sname);
END LOOP;
CLOSE
请有人帮我解决这个问题。
答案 0 :(得分:3)
您还可以为字符串值打开ref_cursor。请看一下:
CREATE OR REPLACE PROCEDURE GetCol(PARAM IN VARCHAR2, recordset OUT sys_refcursor)
AS
QRY varchar2(100);
BEGIN
QRY := 'SELECT DISTINCT '||PARAM||' FROM my_table';
OPEN recordset FOR QRY;
END;
然后:
DECLARE
l_cursor SYS_REFCURSOR;
l_sname VARCHAR2(50);
BEGIN
GetCol('col_name',l_cursor);
LOOP
FETCH l_cursor INTO l_sname;
EXIT WHEN l_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_sname);
END LOOP;
END;
答案 1 :(得分:2)
您的问题是由于程序的SELECT语句中PARAM
的含义模糊不清引起的:
CREATE OR REPLACE
PROCEDURE GetCol(PARAM IN STRING, recordset OUT sys_refcursor)
AS
BEGIN
OPEN recordset FOR
SELECT DISTINCT(PARAM) -- Ambiguity here
FROM my_table;
END;
PARAM
是否引用表列或过程的第一个参数? Oracle已经采用了该参数。你可以明确地说出这样的:
SELECT DISTINCT(my_table.PARAM)
FROM my_table;
您可以在适当的时候(可能不是这里)指定过程参数:
SELECT DISTINCT(GetCol.PARAM)
FROM my_table;
通常最好通过以下方式避免: