问题描述
我们有一个场景,其中表名应动态传递给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语句中动态传递变量?
要求是这个
- 从指定位置将文本文件读取到临时表中。由于oracle不允许在PLSQL中创建表,因此它必须位于动态sql中。文本文件包含ID列表和可在其中找到的表名。
- 从临时表中获取唯一表名的列表,并将其与数据库中每个匹配的表连接,并获取ID列表以进行进一步处理。
有关如何克服此问题的任何帮助或建议?预先感谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)