我正在尝试创建动态合并脚本并动态传递变量,但是变量并未在代码中替换。有人可以帮忙吗?
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;
您未正确进行催化。
可以使用||
运算符或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;
检查它是否对您有用。
干杯!
您为什么在本世纪使用LONG类型?自从Oracle 8.0于1997年问世以来,它已经过时了。
使用CLOB通常会使您的生活更加轻松,但是在这种情况下,即使VARCHAR2也可能足够大以适合您的查询。