Oracle SQL Developer PL/SQL return 数组
Oracle SQL Developer PL/SQL return an array
开发人员,
我到处搜索,但找不到这个简单问题的解决方案。
情况:
我需要编写一个过程,它将列名作为输入,return 该列中存在的所有不同值作为输出。然后我必须在一些 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
有人可以帮我解决这个问题吗?
您的问题是由于过程的 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
是指 table 列还是过程的第一个参数? Oracle 假定了参数。您可以像这样明确地说:
SELECT DISTINCT(my_table.PARAM)
FROM my_table;
如果合适(可能不在此处),您可以改为指定过程参数:
SELECT DISTINCT(GetCol.PARAM)
FROM my_table;
通常最好通过以下方式避免这种情况:
- 总是在列引用 select 语句中使用 table 别名,并且
- 有一个参数名称标准,使它们不太可能发生冲突,例如P_PARAM.
您还可以为字符串值打开一个 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;
开发人员,
我到处搜索,但找不到这个简单问题的解决方案。
情况:
我需要编写一个过程,它将列名作为输入,return 该列中存在的所有不同值作为输出。然后我必须在一些 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
有人可以帮我解决这个问题吗?
您的问题是由于过程的 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
是指 table 列还是过程的第一个参数? Oracle 假定了参数。您可以像这样明确地说:
SELECT DISTINCT(my_table.PARAM)
FROM my_table;
如果合适(可能不在此处),您可以改为指定过程参数:
SELECT DISTINCT(GetCol.PARAM)
FROM my_table;
通常最好通过以下方式避免这种情况:
- 总是在列引用 select 语句中使用 table 别名,并且
- 有一个参数名称标准,使它们不太可能发生冲突,例如P_PARAM.
您还可以为字符串值打开一个 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;