尝试创建动态合并脚本并动态传递变量

问题描述 投票:0回答:2

我正在尝试创建动态合并脚本并动态传递变量,但是变量并未在代码中替换。有人可以帮忙吗?

create or replace PROCEDURE MERGE_APPMODULE(institutionKey varchar2,applname varchar2,modulename varchar2,DESCRIPTION varchar2 )
as
--set serveroutput on;
--SET FEEDBACK OFF;

DATA long;
BEGIN
select

CONCAT ('declare
  institutionkey varchar2(100) := '|| '''institutionkey''' ||' ;
  actiondate DATE  := SYSDATE;
  actionuser VARCHAR2(100) := sys_context(''USERENV'', ''AUTHENTICATED_IDENTITY'');
  supportedLanguages varchar2(100) := ''en'';
BEGIN',
  '
    MERGE INTO APPMODULE TARGET 
        USING (
                SELECT  0 DISALLOW, NULL IMAGE, NULL IsMaintainence, moduleclass,1 ModuleIndex, ''modulename'' ModuleName , ApplId FROM APPLICATION WHERE  ApplName = ''applname''  and FinInstKey = ''institutionKey'')
               ) source 
        ON (
            target.ApplId=source.ApplId and target.ModuleName=source.ModuleName
            )
       WHEN NOT MATCHED THEN
          insert (createddate, creatorusr, Disallow, Image, IsDefault, IsMaintainence, moduleClass, ModuleIndex, ModuleName, updatordate, updatorusr, ApplId) 
          values (actionDate, actionUser, source.Disallow, source.Image, 1, source.IsMaintainence, source.moduleClass, source.ModuleIndex, source.ModuleName, actionDate, actionUser, source.ApplId); 

    MERGE INTO APPMODULETXT target
        USING (
                SELECT ''DESCRIPTION'' DESCRIPTION, ModuleId FROM AppModule m JOIN Application a ON m.ApplId = a.ApplId WHERE m.ModuleName = ''ACCOUNTS_SERVICES_MODULE'' AND a.ApplName = applicationName AND a.finInstKey = ''institutionKey'' 

        ) source 
        ON (
               target.ModuleId = source.ModuleId
            )
        WHEN NOT MATCHED THEN
            insert (Description, TxtLanguage, ModuleId) 
            values (source.Description, ''en'', source.ModuleId);') INTO DATA from dual;

        dbms_output.put_line(DATA);  
  END;
oracle plsql dynamic-sql
2个回答
0
投票

您未正确进行催化。

可以使用||运算符或concat方法将字符串压缩。

在您的代码中,您同时使用了两者,发生了混乱。在这里,我尝试使用||运算符,如下所示:

create or replace PROCEDURE MERGE_APPMODULE(institutionKey varchar2,applname varchar2,modulename varchar2,DESCRIPTION varchar2 )
as
--set serveroutput on;
--SET FEEDBACK OFF;

DATA VARCHAR2(32767); -- using varchar2 data type variable
BEGIN
DATA := 'declare
  institutionkey varchar2(100) := '''|| institutionkey ||''' ;
  actiondate DATE  := SYSDATE;
  actionuser VARCHAR2(100) := sys_context(''USERENV'', ''AUTHENTICATED_IDENTITY'');
  supportedLanguages varchar2(100) := ''en'';
BEGIN' || chr(10) ||
  ' MERGE INTO APPMODULE TARGET 
        USING (
                SELECT  0 DISALLOW, NULL IMAGE, NULL IsMaintainence, moduleclass,1 ModuleIndex, '''|| modulename ||''' ModuleName , ApplId FROM APPLICATION WHERE  ApplName = ''' || applname || ''' and FinInstKey = ''' || institutionKey || '''
               ) source 
        ON (
            target.ApplId=source.ApplId and target.ModuleName=source.ModuleName
            )
       WHEN NOT MATCHED THEN
          insert (createddate, creatorusr, Disallow, Image, IsDefault, IsMaintainence, moduleClass, ModuleIndex, ModuleName, updatordate, updatorusr, ApplId) 
          values (actionDate, actionUser, source.Disallow, source.Image, 1, source.IsMaintainence, source.moduleClass, source.ModuleIndex, source.ModuleName, actionDate, actionUser, source.ApplId); 

    MERGE INTO APPMODULETXT target
        USING (
                SELECT ''' || DESCRIPTION || ''' DESCRIPTION, ModuleId FROM AppModule m JOIN Application a ON m.ApplId = a.ApplId WHERE m.ModuleName = ''ACCOUNTS_SERVICES_MODULE'' AND a.ApplName = applicationName AND a.finInstKey = ''' || institutionKey || '''  
               ) source 
        ON (
               target.ModuleId = source.ModuleId
            )
        WHEN NOT MATCHED THEN
            insert (Description, TxtLanguage, ModuleId) 
            values (source.Description, ''en'', source.ModuleId);';

        dbms_output.put_line(DATA);  
  END;

检查它是否对您有用。

干杯!


0
投票

您为什么在本世纪使用LONG类型?自从Oracle 8.0于1997年问世以来,它已经过时了。

使用CLOB通常会使您的生活更加轻松,但是在这种情况下,即使VARCHAR2也可能足够大以适合您的查询。

© www.soinside.com 2019 - 2024. All rights reserved.