Plsql SYS.DBMS_DDL.WRAP不允许pragma和intctx

Plsql SYS.DBMS_DDL.WRAP不允许pragma和intctx,plsql,Plsql,我使用下面的过程来包装PL/SQL代码 declare l_source DBMS_SQL.VARCHAR2A; l_wrap DBMS_SQL.VARCHAR2A; l_wrap1 clob; typ_ibt utl_file.file_type; cnt number := 0; v_directory varchar2(400) := 'd:\ftpedi\eqpm\eqpm_hold\'; cursor cur_name_get

我使用下面的过程来包装PL/SQL代码

declare
  l_source  DBMS_SQL.VARCHAR2A;
  l_wrap    DBMS_SQL.VARCHAR2A;
  l_wrap1    clob;
  typ_ibt   utl_file.file_type;
  cnt       number := 0;
  v_directory varchar2(400) := 'd:\ftpedi\eqpm\eqpm_hold\';

  cursor cur_name_get is
  select distinct name object_name,type object_type
  from   user_source
  where  type = 'PROCEDURE'
  and    name = 'PROCESS_TIME_INSERT';

  cursor cut_text_get ( p_type in varchar2 , p_name in varchar2 )  is
  select replace(text,chr(10),'') text
  from   user_source
  where  type = p_type
  and    name = p_name;
begin

for i in cur_name_get
loop
     l_source.delete;l_wrap.delete;
     open cut_text_get ( i.object_type,i.object_name );
     fetch cut_text_get bulk collect into l_source;
     close  cut_text_get;
     l_source (1) := 'CREATE OR REPLACE ' || l_source (1);
     l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source,
                                lb  => 1,
                                ub  => l_source.count);
     for i in 1..l_wrap.count
     loop
        if i = 1
        then
            l_wrap1 := l_wrap(i);
        else
            l_wrap1 := l_wrap1 || l_wrap(i);
        end if;
        insert into ibt_global_inter_transfer ( git_process_id,git_c_1)
        values ( 3004, l_wrap1 );
     end loop;                                
  end loop;  

exception when others
then
    dbms_output.put_line('sqlerrm '||sqlerrm||dbms_utility.format_error_backtrace);
end;
上述过程扭曲了正常过程,但不允许使用特殊字符,如“PRAGMA”

下面是示例程序,它不是包装

CREATE OR REPLACE
PROCEDURE xml_insert ( p_in_xml in xmltype ,p_status out varchar2,p_message out varchar2) is
intctx DBMS_XMLSTORE.ctxtype;
rows number;
begin
    p_status := 'S';
    p_message := 'Success';

    intctx := Dbms_xmlstore.newcontext('IBT_GLOBAL_INTER_TRANSFER');
    dbms_xmlstore.clearupdatecolumnlist(intctx);
    dbms_xmlstore.setupdatecolumn(intCtx,'GIT_PROCESS_ID');
    dbms_xmlstore.setupdatecolumn(intCtx,'GIT_SESSION_ID');
    rows := Dbms_xmlstore.insertxml(intctx,p_in_xml);
    dbms_xmlstore.closecontext(intctx);
exception when others
then
    p_status := 'R';
    p_message := sqlerrm||dbms_utility.format_error_backtrace;
    return;    
end;

有人能帮忙吗?

更新

(我误解了这个问题。我以为你的意思是包装的代码没有被创建,现在我明白了真正的问题是包装的输出没有编译。)

删除
替换
,某些行之间需要空白

替换:

  --select replace(text,chr(10),'') text
与:

程序:

CREATE OR REPLACE
PROCEDURE xml_insert ( p_in_xml in xmltype ,p_status out varchar2,p_message out varchar2) is
intctx DBMS_XMLSTORE.ctxtype;
rows number;
pragma autonomous_transaction; --ADDED
begin
    p_status := 'S';
    p_message := 'Success';

    intctx := Dbms_xmlstore.newcontext('IBT_GLOBAL_INTER_TRANSFER');
    dbms_xmlstore.clearupdatecolumnlist(intctx);
    dbms_xmlstore.setupdatecolumn(intCtx,'GIT_PROCESS_ID');
    dbms_xmlstore.setupdatecolumn(intCtx,'GIT_SESSION_ID');
    rows := Dbms_xmlstore.insertxml(intctx,p_in_xml);
    dbms_xmlstore.closecontext(intctx);
exception when others
then
    p_status := 'R';
    p_message := sqlerrm||dbms_utility.format_error_backtrace;
    return;    
end;
/
PL/SQL块包装代码:

declare
  l_source  DBMS_SQL.VARCHAR2A;
  l_wrap    DBMS_SQL.VARCHAR2A;
  l_wrap1    clob;
  typ_ibt   utl_file.file_type;
  cnt       number := 0;
  v_directory varchar2(400) := 'd:\ftpedi\eqpm\eqpm_hold\';

  cursor cur_name_get is
  select distinct name object_name,type object_type
  from   user_source
  where  type = 'PROCEDURE'
  and    name = 'XML_INSERT'; --CHANGED

  cursor cut_text_get ( p_type in varchar2 , p_name in varchar2 )  is
  --select replace(text,chr(10),'') text  --WOOPS!
  select text
  from   user_source
  where  type = p_type
  and    name = p_name;
begin

for i in cur_name_get
loop
     l_source.delete;l_wrap.delete;
     open cut_text_get ( i.object_type,i.object_name );
     fetch cut_text_get bulk collect into l_source;
     close  cut_text_get;
     l_source (1) := 'CREATE OR REPLACE ' || l_source (1);
     l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source,
                                lb  => 1,
                                ub  => l_source.count);
     for i in 1..l_wrap.count
     loop
        if i = 1
        then
            l_wrap1 := l_wrap(i);
        else
            l_wrap1 := l_wrap1 || l_wrap(i);
        end if;
        --insert into ibt_global_inter_transfer ( git_process_id,git_c_1)
        --values ( 3004, l_wrap1 );
        dbms_output.put_line(l_wrap1);
     end loop;                                
  end loop;  

exception when others
then
    dbms_output.put_line('sqlerrm '||sqlerrm||dbms_utility.format_error_backtrace);
end;
/

它在12.1.0.1.0上对我有效。然而,我不得不做一些小的修改来运行代码,比如更改
name='PROCESS\u TIME\u INSERT'
,添加一个
pragma
,并用dbms\u输出替换插入。如果这是一个解析错误,那么这些微小的更改可能会带来很大的不同。您能否稍微修改一下您的代码,以便其他人可以测试100%相同的版本?您好@jonearles,您能否将修改后的代码作为解决方案发布,以便我可以看到您在上述代码段中所做的更改。@Sravan:我添加了代码作为答案。@jonearls谢谢您的代码。不幸的是,我们只有Oracle11g。我们将在Oracle11g中尝试它,并让您知道它的状态。Hi@jonearles在编译包装的源代码时给出以下错误处理。。。(1) :PLS-00103:在预期以下情况时遇到符号“ISINTCTX”:(1):;使用外部(1)以authid作为群集顺序的is:确定性并行\u启用流水线结果\u缓存(1):符号“is”被替换为“ISINTCTX”以继续。(2) :PLS-00103:在预期以下情况之一时遇到符号“文件结束”:(2):开始函数pragma过程子类型(2):当前光标删除(2):存在先前编译的过程XML\u INSERT,但有错误;我们在Oracle中也面临同样的问题11g@Sravan查看更新,我认为问题是删除了太多的空白导致了一些令牌合并。
declare
  l_source  DBMS_SQL.VARCHAR2A;
  l_wrap    DBMS_SQL.VARCHAR2A;
  l_wrap1    clob;
  typ_ibt   utl_file.file_type;
  cnt       number := 0;
  v_directory varchar2(400) := 'd:\ftpedi\eqpm\eqpm_hold\';

  cursor cur_name_get is
  select distinct name object_name,type object_type
  from   user_source
  where  type = 'PROCEDURE'
  and    name = 'XML_INSERT'; --CHANGED

  cursor cut_text_get ( p_type in varchar2 , p_name in varchar2 )  is
  --select replace(text,chr(10),'') text  --WOOPS!
  select text
  from   user_source
  where  type = p_type
  and    name = p_name;
begin

for i in cur_name_get
loop
     l_source.delete;l_wrap.delete;
     open cut_text_get ( i.object_type,i.object_name );
     fetch cut_text_get bulk collect into l_source;
     close  cut_text_get;
     l_source (1) := 'CREATE OR REPLACE ' || l_source (1);
     l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source,
                                lb  => 1,
                                ub  => l_source.count);
     for i in 1..l_wrap.count
     loop
        if i = 1
        then
            l_wrap1 := l_wrap(i);
        else
            l_wrap1 := l_wrap1 || l_wrap(i);
        end if;
        --insert into ibt_global_inter_transfer ( git_process_id,git_c_1)
        --values ( 3004, l_wrap1 );
        dbms_output.put_line(l_wrap1);
     end loop;                                
  end loop;  

exception when others
then
    dbms_output.put_line('sqlerrm '||sqlerrm||dbms_utility.format_error_backtrace);
end;
/