将函数参数传递给oracle中的游标

Posted

技术标签:

【中文标题】将函数参数传递给oracle中的游标【英文标题】:pass function argument to cursor in oracle 【发布时间】:2014-07-30 18:30:16 【问题描述】:

将函数参数传递给光标时出现错误。这是下面的例子

创建或替换 FUNCTION UPD_TAB(ID_VAL IN OUT VARCHAR2,SRC_COLUMN IN OUT VARCHAR2,DEST_COLUMN IN OUT VARCHAR2,OWNER_TAB IN OUT VARCHAR2,SRC_TAB IN OUT VARCHAR2,DEST_TAB IN OUT VARCHAR2) 返回 VARCHAR2 是

   SRC_COL VARCHAR2(30) := SRC_COLUMN; DEST_COL VARCHAR2(20) := DEST_COLUMN; ID_VALUE VARCHAR2(20) := ID_VAL; SRC_TABLE VARCHAR(20) := SRC_TAB; DEST_TABLE VARCHAR(20) := DEST_TAB; TAB1 VARCHAR2(40) := OWNER_TAB||'.'||SRC_TAB; TAB2 VARCHAR2(40) := OWNER_TAB||'.'||DEST_TAB; CURSOR RET_VAL 是 选择 C1.SRC_COL,C2.DEST_COL 来自 TAB1 C1,TAB2 C2 哪里 C1.SRC_COL=C2.DEST_COL AND C1.ID=ID_VALUE; 在上面的示例中,当传递实际的数据库值 Schemaname.Tablename 例如。 grany.Booking 。它输出结果,但是当我传递具有值 TAB1 和 TAB2 的变量时。它显示以下错误

PL/SQL: ORA-00942: 表或视图不存在 22/11 PL/SQL:语句被忽略

我搜索了很多,但没有找到解决方案 我知道要说什么错误,但我不知道如何解决这个问题。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

谷歌“Oracle 动态 SQL”。 【参考方案1】:

静态游标无法从变量中获取表名和列名。解决此问题的一种方法是在 VARCHAR2 变量中构建查询,然后为查询字符串打开一个通用游标(SYS_REFCURSOR 类型,在 SYS.STANDARD 包中定义):

CREATE OR REPLACE FUNCTION UPD_TAB(ID_VAL      IN OUT VARCHAR2,
                                   SRC_COLUMN  IN OUT VARCHAR2,
                                   DEST_COLUMN IN OUT VARCHAR2,
                                   OWNER_TAB   IN OUT VARCHAR2,
                                   SRC_TAB     IN OUT VARCHAR2,
                                   DEST_TAB    IN OUT VARCHAR2)
  RETURN VARCHAR2
IS
  SRC_COL     VARCHAR2(30) := SRC_COLUMN;
  DEST_COL    VARCHAR2(20) := DEST_COLUMN;
  ID_VALUE    VARCHAR2(20) := ID_VAL;
  SRC_TABLE   VARCHAR2(20) := SRC_TAB;
  DEST_TABLE  VARCHAR2(20) := DEST_TAB;
  TAB1        VARCHAR2(40) := OWNER_TAB||'.'||SRC_TAB;
  TAB2        VARCHAR2(40) := OWNER_TAB||'.'||DEST_TAB;

  vVAL1       VARCHAR2(2000);
  vVAL2       VARCHAR2(2000);

  strCursor   VARCHAR2(32767) :=
     'SELECT C1.' || SRC_COL ||
           ',C2.' || DEST_COL ||
       'FROM ' || TAB1 || ' C1, ' ||
                  TAB2 || ' C2 ' ||
       'WHERE C1.' || SRC_COL || '=C2.' || DEST_COL || ' AND ' ||
             'C1.ID=' || ID_VALUE;

  csr         SYS_REFCURSOR;
BEGIN
  OPEN csr FOR strCursor;

  LOOP
    FETCH csr
      INTO vVAL1, vVAL2;

    EXIT WHEN csr%NOTFOUND;

    -- Do something useful with values fetched from cursor;
  END LOOP;

  CLOSE csr;
END UPD_TAB;

分享和享受。

【讨论】:

以上是关于将函数参数传递给oracle中的游标的主要内容,如果未能解决你的问题,请参考以下文章

自动将参数传递给 oracle plsql 函数

将数组中的所有值作为参数传递给函数

如何通过单击 PyQt 中的按钮将参数传递给函数?

django 将参数传递给模板标签中的函数

Python Pandas:将参数传递给 agg() 中的函数

将参数传递给Lua 4中的函数[重复]