动态SQL中具有动态表名称的ORACLE REF游标

问题描述

我们有一个场景,其中表名应动态传递给REF游标。表名是在另一个动态sql内构建的,而oracle无法正确构建SQL。这是PLSQL块

DECLARE
  c_TableCreated NUMBER := 0;
  strDynamicSQL VARCHAR2(4000);
  strDynamicSQL1 VARCHAR2(4000);   
BEGIN  
dbms_output.ENABLE;
strDynamicSQL := 'CREATE DIRECTORY testdir as ''C:\Temp\UID''';
EXECUTE IMMEDIATE strDynamicSQL;
strDynamicSQL := 'CREATE TABLE temp11 (
                      UID       VARCHAR2(128),Source    VARCHAR2(50),TABLENAME    VARCHAR(50))
                      Organization external
                      (type oracle_loader
                      default directory testdir
                      access parameters (records delimited by newline
                      fields terminated by ''##'')
                      location (''SourceUIDs.txt''))
                      reject limit 1000';   
  
    EXECUTE IMMEDIATE strDynamicSQL;
    c_TableCreated := 1;
    strDynamicSQL := '
    DECLARE
    c_UID   nvarchar2(128);
    c_ID   nvarchar2(128);
    c_DEFUID varchar2(128);
    c_class varchar2(40);
    c_SOURCE  varchar2(50);
    c_TableName VARCHAR2(50);
    v_emp_refcur    SYS_REFCURSOR;
    CURSOR lcsrTablePrefixes IS SELECT DISTINCT TABLENAME FROM temp11;
    
    PROCEDURE GetCURSOR(pstrTableName IN VARCHAR2,p_emp_refcur IN OUT SYS_REFCURSOR) IS
    BEGIN 
       OPEN p_emp_refcur FOR SELECT S.ID,S.UID,S.DEFUID,S.CLASS,U.Source  FROM pstrTableName S INNER JOIN temp11 U ON U.OBJUID = S.OBJUID
        WHERE UPPER(U.TABLENAME) = UPPER(pstrTableName );
    END;
    
    BEGIN
    FOR J IN lcsrTablePrefixes LOOP
      c_TableName := J.TABLENAME;
      GetCURSOR(c_TableName,v_emp_refcur);
      LOOP
        FETCH v_emp_refcur INTO c_ID,c_UID,c_DEFUID,c_class,c_SOURCE;
        dbms_output.put_line(c_ID);
        EXIT WHEN v_emp_refcur%NOTFOUND;        
    END LOOP;
    END LOOP;
    END;';
  EXECUTE IMMEDIATE strDynamicSQL;
  strDynamicSQL := 'DROP DIRECTORY testdir';
  EXECUTE IMMEDIATE strDynamicSQL;
  strDynamicSQL := 'Drop Table temp11';
  EXECUTE IMMEDIATE strDynamicSQL;
  strDynamicSQL := NULL;
EXCEPTION
WHEN OTHERS THEN
  IF c_TableCreated = 1 THEN   
    EXECUTE IMMEDIATE 'DROP DIRECTORY testdir';
    EXECUTE IMMEDIATE 'drop table temp11';
  END IF; 
    RAISE;
END;         

运行该块时,我们会收到错误消息“表或视图不存在”,这是通过GetCursor过程使用传入的表名参数动态构建游标的。由于它已经在动态块中,所以ORACLE无法识别表名。

有没有办法在另一个动态SQL语句中动态传递变量?

要求是这个

  1. 从指定位置将文本文件读取到临时表中。由于oracle不允许在PLSQL中创建表,因此它必须位于动态sql中。文本文件包含ID列表和可在其中找到的表名。
  2. 从临时表中获取唯一表名的列表,并将其与数据库中每个匹配的表连接,并获取ID列表以进行进一步处理。

有关如何克服此问题的任何帮助或建议?预先感谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...