при переносе схемы оракула в 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?