I am trying to execute an insert into table statement inside a stored procedure. The problem is that the statement contains a CASE statement which cannot be executed inside a pl/sql block. The work around is to use execute immediate 'Sql statement' ; The problem is that the SQL statement is so big it cannot fit into a v_string varchar2(4000). I did split
the sql into 5 variables v_string1, v_string2...v_string5. and then tried to execute
execute immediate v_string1||v_string2.... ||v_string5;
the procedure compiles ok but when I execute it
I get this error
ORA-06502: PL/SQL: numeric or value error: character to number conversion error.
The body of the stored procedure:
CREATE OR REPLACE PROCEDURE SP_COLLECT_TBLCIF_STAGE2
as
v_strstmt1 varchar2(4000);
v_strstmt2 varchar2(4000);
v_strstmt3 varchar2(4000);
v_strstmt4 varchar2(4000);
v_strstmt5 varchar2(4000);
BEGIN
Execute immediate 'TRUNCATE TABLE STAGE.TBLCIF_STAGE2';
/* Execute immediate 'DROP TABLE STAGE.TBLCIF_STAGE2_NEW'; */
v_strstmt1 :=
'INSERT INTO STAGE.TBLCIF_STAGE2_NEW AS'||
'select /*+ PARALLEL(STAGE.TBLCIF_STAGE1)*/'||
'CIF_ACCOUNT_NUMBER ,'||
'CIF_CHECKING_ACCT_NO ,'||
'CIF_SAVINGS_ACCT_NO ,'||
'CASE When substr(trim(CIF_SOCIAL_SECURITY) , Length(trim(CIF_SOCIAL_SECURITY)), 1) in ( ''{'' ,''A'',''B'',''C'',''D'',''E'',''F'',''G'',''H'',''I'') then '||
'substr(trim(CIF_SOCIAL_SECURITY) , 1, Length(trim(CIF_SOCIAL_SECURITY ))-1)||DECODE(substr(trim(CIF_SOCIAL_SECURITY) , Length(trim(CIF_SOCIAL_SECURITY)),1), ''A'',''1'',''B'',''2'',''C'',''3'',''D'',''4'',''E'',''5'',''F'',''6'',''G'',''7'',''H'',''8'',''I' ',''9'',''{'',''0'')'||
'else'||
''-'||substr(trim(CIF_SOCIAL_SECURITY), 1, Length(trim(CIF_SOCIAL_SECURITY))-1) || DECODE(substr(trim(CIF_SOCIAL_SECURITY), Length(trim(CIF_SOCIAL_SECURITY)),1), ''J'',''1'',''K'',''2'',''L'',''3'',''M'',''4'',''N'',''5'',''O'',''6'',''P'',''7'',''R'',''8'',''Q' ',''9'',''}'',''0'')'||
' end AS CIF_SOCIAL_SECURITY,'||
'CIF_PRINCIPAL_NAME ,'||
'CIF_SEX_CODE ,'||
'CIF_SPOUSE_NAME ,'||
'CIF_ADDR_LINE_1 ,'||
'CIF_ADDR_LINE_2 ,'||
'CIF_CITY ,'||
'CIF_STATE ,'||
'SUBSTR(CIF_ZIP ,1,LENGTH(TRIM(CIF_ZIP))-1) AS CIF_ZIP ,'||
'CIF_CYCLE_CODE ,'||
'CIF_EXTERNAL_STATUS ,'||
'CIF_INTERNAL_STATUS ,'||
'CASE When substr(trim(CIF_NUMBER_CARDS), Length(trim(CIF_NUMBER_CARDS)), 1) in ( ''{'' ,''A'',''B'',''C'',''D'',''E'',''F'',''G'',''H'',''I'') then'||
'substr(trim(CIF_NUMBER_CARDS), 1, Length(trim(CIF_NUMBER_CARDS))-1)||DECODE(substr(trim(CIF_NUMBER_CARDS) , Length(trim(CIF_NUMBER_CARDS)),1), ''A'',''1'',''B'',''2'',''C'',''3'',''D'',''4'',''E'',''5'',''F'',''6'',''G'',''7'',''H'',''8'',''I' ',''9'',''{'',''0'')'||
'else'||
''-'||substr(trim(CIF_NUMBER_CARDS), 1, Length(trim(CIF_NUMBER_CARDS))-1) || DECODE(substr(trim(CIF_NUMBER_CARDS), Length(trim(CIF_NUMBER_CARDS)),1), ''J'',''1'',''K'',''2'',''L'',''3'',''M'',''4'',''N'',''5'',''O'',''6'',''P'',''7'',''R'',''8'',''Q' ',''9'',''}'',''0'')'||
' end as CIF_NUMBER_CARDS'||
'CIF_TYPE_CARD ,'||
'CIF_OPEN_DATE ,'||
'CIF_EXPIRATION_DATE ,'||
'CIF_RENEWAL_CODE ,'||
'CASE When substr(trim(CIF_CREDIT_LINE) , Length(trim(CIF_CREDIT_LINE)), 1) in ( ''{'' ,''A'',''B'',''C'',''D'',''E'',''F'',''G'',''H'',''I'') then'||
' substr(trim(CIF_CREDIT_LINE) , 1, Length(trim(CIF_CREDIT_LINE))-1)||DECODE(substr(trim(CIF_CREDIT_LINE), Length(trim(CIF_CREDIT_LINE)),1), ''A'',''1'',''B'',''2'',''C'',''3'',''D'',''4'',''E'',''5'',''F'',''6'',''G'',''7'',''H'',''8'',''I' ',''9'',''{'',''0'')'||
'else'||
' '-'||substr(trim(CIF_CREDIT_LINE), 1, Length(trim(CIF_CREDIT_LINE))-1) || DECODE(substr(trim(CIF_CREDIT_LINE), Length(trim(CIF_CREDIT_LINE)),1), ''J'',''1'',''K'',''2'',''L'',''3'',''M'',''4'',''N'',''5'',''O'',''6'',''P'',''7'',''R'',''8'',''Q' ',''9'',''}'',''0'')'||
' end AS CIF_CREDIT_LINE,'||
'CASE When substr(trim(CIF_BIRTH_DATE) , Length(trim(CIF_BIRTH_DATE)), 1) in ( ''{'' ,''A'',''B'',''C'',''D'',''E'',''F'',''G'',''H'',''I'') then'||
' substr(trim(CIF_BIRTH_DATE), 1, Length(trim(CIF_BIRTH_DATE))-1)||DECODE(substr(trim(CIF_BIRTH_DATE), Length(trim(CIF_BIRTH_DATE)),1), ''A'',''1'',''B'',''2'',''C'',''3'',''D'',''4'',''E'',''5'',''F'',''6'',''G'',''7'',''H'',''8'',''I' ',''9'',''{'',''0'')'||
' else'||
' '-'||substr(trim(CIF_BIRTH_DATE), 1, Length(trim(CIF_BIRTH_DATE))-1) || DECODE(substr(trim(CIF_BIRTH_DATE), Length(trim(CIF_BIRTH_DATE)),1), ''J'',''1'',''K'',''2'',''L'',''3'',''M'',''4'',''N'',''5'',''O'',''6'',''P'',''7'',''R'',''8'',''Q' ',''9'',''}'',''0'')'||
'end as CIF_BIRTH_DATE,'||
exception
when value_error then
dbms_output.put_line ('VALUE_ERROR');
END;
everything boils down to two questions:
1. How can I include a CASE in a pl/sql block?
2. What datatype should I use to store the entire SQL statement that needs to be executed by execute immediate?
Bookmarks