【问题标题】:Oracle SQL Developer PL/SQL return an arrayOracle SQL Developer PL/SQL 返回一个数组
【发布时间】:2015-04-06 22:16:59
【问题描述】:

开发人员,

我到处搜索,但找不到这个简单问题的解决方案。

情况:

我需要编写一个过程,它将列名作为输入并返回该列中存在的所有不同值作为输出。然后我必须在一些 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 语句很奇怪。如果你运行“select distinct('col_name') from my_table”你会得到什么?您需要立即执行。
  • 我只需要从该特定列中获取所有唯一值。

标签: oracle stored-procedures plsql procedure cursors


【解决方案1】:

您还可以为字符串值打开 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;

【讨论】:

  • 这有帮助!非常感谢。
【解决方案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;

通常最好通过以下方式避免这种情况:

  • 在列引用选择语句中始终使用表别名,并且
  • 有一个参数名称标准,使它们不太可能发生冲突,例如P_PARAM。

【讨论】:

  • PARAM 这里是列名,也是过程的唯一 IN 参数。当用户给出列名时,过程应该返回该特定列中存在的所有不同值。
猜你喜欢
  • 2013-11-20
  • 1970-01-01
  • 2015-09-16
  • 2021-09-11
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多