无法在pl / pgsql中创建过程,但代码在没有创建过程的情况下工作

时间:2016-07-25 16:19:54

标签: postgresql plpgsql

我一直在努力创建一个程序,以便“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;

2 个答案:

答案 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更改为oracleplpgsql更改为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);