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

时间:2014-07-30 18:30:17

标签: oracle plsql oracle11g oracle10g

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


创建或替换FUNCTION UPD_TAB(OUT_ VARCHAR2中的ID_VAL,OUT VARCHAR2中的SRC_COLUMN,OUT VARCHAR2中的DEST_COLUMN,OUT VARCHAR2中的OWNER_TAB,OUT VARCHAR2中的SRC_TAB,OUT VARCHAR2中的DEST_TAB)
RETURN VARCHAR2
IS

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
IS
SELECT C1.SRC_COL,C2.DEST_COL
FROM TAB1 C1,TAB2 C2
在哪里C1.SRC_COL = C2.DEST_COL
AND C1.ID = ID_VALUE;

这里在上面的例子中传递时传递实际的数据库值Schemaname.Tablename 例如。格兰尼。开玩笑。它输出结果但是当我传递具有值TAB1和TAB2的变量时。它显示以下错误


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

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

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

1 个答案:

答案 0 :(得分:0)

静态游标无法从变量中获取表名和列名。解决此问题的一种方法是在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;

分享并享受。