我在 Oracle 11.2.0.4 上,需要将数据库过程转换为 Postgresql 9.6。我有 Amazon SCT 工具,但它在一些特定情况下会出错。我正在研究的是一个 pl/sql 过程,该过程具有输入类型作为对象类型的集合。代码如下,转换时出错。任何关于我如何去做的建议,我都会非常感激。转换时的错误是由于这一行
select count(*) INTO v_cnt from TABLE(t_cust_tab_type_i) ; <- 似乎 postgresql 没有嵌套类型或集合的集合,因此可能会出现此错误-不确定我刚开始使用 postgresql,并且我没有很多知识。
:
create or replace type temp_n_cust_header_type
is
object(ssn number,
fname varchar2(20),
lname varchar2(20),
items varchar2(100));
/
pause ;
create or REPLACE type temp_n_customer_tab_type is table of temp_n_cust_header_type;
/
pause;
CREATE OR REPLACE PROCEDURE temp_n_ins_cust_proc (
p_cust_tab_type_i IN temp_n_customer_tab_type)
IS
t_cust_tab_type_i temp_n_customer_tab_type;
v_cnt number;
BEGIN
t_cust_tab_type_i := temp_n_customer_tab_type();
select count(*) INTO v_cnt from TABLE(t_cust_tab_type_i);
DBMS_OUTPUT.put_line (
'there are '
||v_cnt
/* || p_cust_tab_type_i.COUNT */
|| ' elements in the collection');
FOR i IN 1 .. p_cust_tab_type_i.COUNT
LOOP
DBMS_OUTPUT.put_line (
'ssn(' || i || ') = ' || p_cust_tab_type_i (i).ssn);
END LOOP;
END;
/
谢谢,尼拉夫
这是我在 postgresql 中的内容:
CREATE TYPE temp_n_cust_header_type AS (
ssn DOUBLE PRECISION,
fname CHARACTER VARYING(20),
lname CHARACTER VARYING(20),
items CHARACTER VARYING(100)
);
CREATE TYPE temp_n_customer_tab_type AS (
col1 temp_n_cust_header_type[]
);
CREATE OR REPLACE FUNCTION temp_n_ins_cust_proc(IN p_cust_tab_type_i temp_n_customer_tab_type)
RETURNS void
AS
$BODY$
DECLARE
t_cust_tab_type_i temp_n_customer_tab_type;
v_cnt DOUBLE PRECISION;
BEGIN
t_cust_tab_type_i := ARRAY[]
/*
[9996 - Severity CRITICAL - Transformer error occurred. Please submit report to developers.]
select count(*) INTO v_cnt from TABLE(t_cust_tab_type_i)
*/;
RAISE DEBUG USING MESSAGE := CONCAT_WS('', 'there are ', v_cnt
/* || p_cust_tab_type_i.COUNT */, ' elements in the collection');
FOR i IN 1..array_length(p_cust_tab_type_i, 1) LOOP
RAISE DEBUG USING MESSAGE := CONCAT_WS('', 'ssn(', i, ') = ', p_cust_tab_type_i[i].ssn);
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;