我一直在努力创建一个程序,以便“EXECUTE
INSERT INTO
”一张桌子。我放弃了这一点并继续尝试动态生成代码中所需的插入。
我已经解决了我的问题,没有创建程序,只是从“DECLARE
”位开始;但仍未设法使pl / pgsql程序起作用。
以下程序无效:
CREATE PROCEDURE populate_xcc_allocatable() AS
$body$
DECLARE
TYPE tablearray IS VARRAY(17) OF VARCHAR2(30);
xa_tables tablearray := tablearray('allocation', 'container', 'location', 'sap_posting', 'status');
total integer;
BEGIN
total := xa_tables.count;
FOR i IN 1..total
LOOP
dbms_output.put_line('INSERT INTO allocatable VALUES (nextval(''allocatable_id_seq''), ''' || xa_tables(i) || ''');');
END LOOP;
END;
$body$
LANGUAGE plpgsql;
LINE 4: TYPE tablearray IS VARRAY(17) OF VARCHAR2(30);
CONTEXT: invalid type name "tablearray IS VARRAY(17) OF VARCHAR2(30)"
但这很好用:
DECLARE
TYPE tablearray IS VARRAY(17) OF VARCHAR2(30);
xa_tables tablearray := tablearray('allocation', 'container', 'location', 'spirit_portion', 'activity', 'asset_ownership', 'container_location', 'sap_posting', 'status');
total integer;
BEGIN
total := xa_tables.count;
FOR i IN 1..total
LOOP
dbms_output.put_line('INSERT INTO xcc_allocatable VALUES (nextval(''xcc_allocatable_id_seq''), ''' || xa_tables(i) || ''');');
END LOOP;
END;
答案 0 :(得分:2)
dbms_output.put_line
是神谕。而declare
是oracle anonymous PL/SQL block
对于postgres,您应该使用raise info '%','some text';
而不是dbms_output.put_line('some text');
而不是匿名PL / SQL块使用do
语句,如
do
$$
declare
begin
end;
$$
;
坦率地说,如果您将标记postgres
更改为oracle
而plpgsql
更改为plsql
,我认为您会获得更多帮助...
答案 1 :(得分:1)
PostgreSQL没有程序,但函数返回void
代替:
CREATE FUNCTION populate_xcc_allocatable() RETURNS void AS $body$
没有“本地类型”,请改用array type:
DECLARE
xa_tables text[] := array[
'allocation', 'container', 'location',
'spirit_portion', 'activity', 'asset_ownership',
'container_location', 'sap_posting', 'status'];
total integer;
i integer; -- Loop variables should be explicitly declared
要进行数组测量,请使用array functions:
BEGIN
total := array_length(xa_tables, 1);
FOR i in 1 .. total LOOP
raise info 'INSERT INTO allocatable VALUES (nextval(''allocatable_id_seq''), ''%'');', xa_tables[i];
END LOOP;
任何功能都应该由RETURN
:
RETURN;
END $body$ language plpgsql;
最后,您尝试创建的函数可以替换为纯SQL:
INSERT INTO allocatable
SELECT nextval('allocatable_id_seq'), x
FROM unnest(array[
'allocation', 'container', 'location',
'spirit_portion', 'activity', 'asset_ownership',
'container_location', 'sap_posting', 'status']) as t(x);