Обнаружена несовместимость в операторе IF в PostgreSQL при переносе оракула в Postgresql - PullRequest
0 голосов
/ 05 ноября 2019

при переносе схемы оракула в postgresql мы получили ошибку в процедуре. Ошибка «Обнаружена несовместимость в операторе IF». Ниже вы можете найти код SQL в oracle: -

'' '

create or replace PROCEDURE generate_create_table_new ( 
 in_schema_name IN VARCHAR2, 
 in_table_name IN VARCHAR2, 
 in_run_id IN NUMBER, 
 in_target_table_name in VARCHAR2 
) 
AS 
 starting BOOLEAN := TRUE; 
 cnt NUMBER := 0; 
 query_str VARCHAR2 (10000); 
 v_oracle_data_type VARCHAR2 (1000); 
 v_new_column_name VARCHAR (30); 

 TYPE v_array IS TABLE OF VARCHAR2 (200); 

 column_name_array v_array := v_array (); 
 new_data_type EXCEPTION; 
 no_records_in_metadata EXCEPTION; 
 create_script clob := NULL; 
 v_cnt_cols_renamed number(4):=0; 
BEGIN 
 SELECT COUNT ( * ) 
 INTO cnt 
 FROM P_VEEVA_COLUMNS 
 WHERE OBJECT_NAME = in_table_name and RUN_ID=in_run_id; 

 IF cnt > 0 
 THEN 
 create_script := 
 'CREATE TABLE ' 
 || UPPER (SUBSTR (in_schema_name, 1, 30)) 
 || '.' 
 || UPPER (SUBSTR (in_target_table_name, 1, 30)) 
 || '('; 

 FOR r IN (SELECT column_name 
 FROM P_VEEVA_COLUMNS 
 WHERE OBJECT_NAME = in_table_name and RUN_ID = in_run_id order by column_id) 
 LOOP 
 IF starting 
 THEN 
 starting := FALSE; 
 ELSE 
 create_script := create_script || ','; 
 END IF; 

 FOR d IN (SELECT DATA_TYPE_ORACLE, 
 CONDITION1, 
 CONDITION2, 
 CONDITION3 
 FROM P_DATA_TYPE_CONVERSION_LOGIC) 
 LOOP 
 v_oracle_data_type := NULL; 

 BEGIN 
 query_str := 
 'SELECT ' 
 || d.DATA_TYPE_ORACLE 
 || ' from P_VEEVA_COLUMNS where RUN_ID='||in_run_id||'and OBJECT_NAME =''' 
 || in_table_name 
 || '''and column_name=''' 
 || r.column_name 
 || ''' and ' 
 || d.condition1; 

 IF d.CONDITION2 IS NOT NULL 
 THEN 
 query_str := query_str || ' and ' || d.CONDITION2; 
 END IF; 

 IF d.CONDITION3 IS NOT NULL 
 THEN 
 query_str := query_str || ' and ' || d.CONDITION3; 
 END IF; 

 EXECUTE IMMEDIATE query_str INTO v_oracle_data_type; 
 EXCEPTION 
 WHEN NO_DATA_FOUND 
 THEN 
 v_oracle_data_type := NULL; 
 END; 

 IF v_oracle_data_type IS NOT NULL 
 THEN 
 IF UPPER (SUBSTR (r.column_name, 1, 30)) NOT MEMBER OF column_name_array 
 THEN 
 v_new_column_name := UPPER (SUBSTR (r.column_name, 1, 30)); 
 column_name_array.EXTEND; 
 column_name_array (column_name_array.COUNT) := 
 v_new_column_name; 
 ELSE 
 FOR i IN 1 .. 100 
 LOOP 
 v_new_column_name := 
 UPPER (SUBSTR (r.column_name, 1, 30 - LENGTH (i))) 
 || TO_CHAR (i); 

 IF v_new_column_name NOT MEMBER OF column_name_array 
 THEN 
 column_name_array.EXTEND; 
 column_name_array (column_name_array.COUNT) := 
 v_new_column_name; 
 EXIT; 
 END IF; 
 END LOOP; 
 END IF; 

 create_script := 
 create_script 
 || v_new_column_name 
 || ' ' 
 || v_oracle_data_type; 

 EXIT; 
 END IF; 
 END LOOP; 

 IF v_oracle_data_type IS NULL 
 THEN 
 RAISE new_data_type; 
 END IF; 

 IF UPPER (SUBSTR (r.column_name, 1, 30))!=v_new_column_name then 
 v_cnt_cols_renamed := v_cnt_cols_renamed+1; 
 Insert into P_COLUMNS_RENAMED (RUN_ID,OBJECT_NAME,COLUMN_NAME,TGT_COLUMN_NAME) values ( in_run_id,in_table_name,r.column_name, v_new_column_name); 
 END IF; 
 END LOOP; 

 FOR vcr_cnt IN 1 .. 100 
 LOOP 
 IF v_cnt_cols_renamed>=99 then 
 EXIT; 
 END IF; 
 Insert into P_COLUMNS_RENAMED (RUN_ID,OBJECT_NAME,COLUMN_NAME,TGT_COLUMN_NAME) values ( in_run_id,in_table_name,'Id','Id'); 
 v_cnt_cols_renamed := v_cnt_cols_renamed+1; 
 END LOOP; 

 ELSE 
 RAISE no_records_in_metadata; 
 END IF; 

 create_script := create_script || ')'; 

 --DBMS_OUTPUT.put_line (create_script); 

 EXECUTE IMMEDIATE create_script; 

EXCEPTION 
 WHEN new_data_type 
 THEN 
 raise_application_error ( 
 -20001, 
 'New datatype found ' 
 || in_table_name 
 || '. Please add to data type conversion_log' 
 ); 
 WHEN no_records_in_metadata 
THEN 
 raise_application_error ( -20002, 'Records missing in Veeva Columns object for ' || in_table_name 
 ); 
 WHEN OTHERS 
 THEN 
 raise_application_error (SQLCODE, SUBSTR(SQLERRM, 1, 200) ||' '|| in_table_name);
END;'''

Ниже приведена ошибка при переносе процедуры в Postgresql: -

Несовместимость найдена вСтрока 85 оператора IF, char 56

В строке оператора IF IF 98, char 42

Строка 104 оператора несовместимого цикла, char 25

В строке оператора IF 105 несовместимостьchar 22 * ​​1014 *

Строка 106 оператора несовместимого цикла, символ 19

Строка 115 оператора несовместного цикла, символ 16

В строке оператора IF обнаружена несовместимость 116, символ 13

Ошибка в строке распознавания синтаксиса 129, символ 6.

Как преодолеть эту ошибку в postgreSQl?

...