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

在oracle中将函数参数传递给游标,oracle,plsql,oracle11g,oracle10g,Oracle,Plsql,Oracle11g,Oracle10g,将函数参数传递给游标时出错。下面是一个例子 创建或替换函数UPD_选项卡(ID_VAL IN OUT VARCHAR2,SRC_COLUMN IN OUT VARCHAR2,DEST_COLUMN IN OUT VARCHAR2,OWNER_选项卡IN OUT VARCHAR2,SRC_选项卡IN OUT VARCHAR2,DEST_选项卡IN OUT VARCHAR2) 返回VARCHAR2 是 SRC_COL VARCHAR2(30):=SRC_柱 DEST_COL VARCHAR2(20

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


创建或替换函数UPD_选项卡(ID_VAL IN OUT VARCHAR2,SRC_COLUMN IN OUT VARCHAR2,DEST_COLUMN IN OUT VARCHAR2,OWNER_选项卡IN OUT VARCHAR2,SRC_选项卡IN OUT VARCHAR2,DEST_选项卡IN OUT VARCHAR2)
返回VARCHAR2

SRC_COL VARCHAR2(30):=SRC_柱
DEST_COL VARCHAR2(20):=DEST_列
ID_值VARCHAR2(20):=ID_值
SRC_TABLE VARCHAR(20):=SRC_TAB
DEST_TABLE VARCHAR(20):=DEST_TAB
表1 VARCHAR2(40):=所有者选项卡| |'。| | SRC|选项卡
TAB2 VARCHAR2(40):=所有者选项卡| |'。| |目的选项卡

光标返回值

选择C1.SRC\u COL,C2.DEST\u COL
从表1 C1到表2 C2
其中C1.SRC\u COL=C2.DEST\u COL
和C1.ID=ID_值

在上面的示例中,当传递实际的数据库值Schemaname.Tablename时 奶奶,预订。它输出结果,但当我传递值为TAB1和TAB2的变量时。它显示以下错误


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

我找了很多,但没有找到答案 我知道错误是什么,但我不知道如何解决这个问题


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

静态游标无法从变量获取表名和列名。解决此问题的一种方法是在VARCHAR2变量中构建查询,然后为查询字符串打开一个通用游标(SYS\u REFCURSOR type,在包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;
分享和享受。

Google“Oracle动态SQL”。