2016-07-25 23 views
0

我一直在嘗試創建一個過程以便「EXECUTEINSERT INTO」表格。我放棄了這一點,並繼續嘗試動態生成所需的代碼插入。無法在pl/pgsql中創建過程,但代碼在沒有創建過程的情況下工作

我已經通過不創建程序並簡單地從「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; 

回答

1
更多幫助10個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完成:

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); 
:10
RETURN; 
END $body$ language plpgsql; 

最後,你要創建的功能可以通過純SQL替代

2

dbms_output.put_line是甲骨文。和declare是甲骨文anonymous PL/SQL block

Postgres的你應該使用raise info '%','some text';dbms_output.put_line('some text');

和,而不是匿名PL/SQL塊使用do語句來代替,像

do 
$$ 
declare 
begin 
end; 
$$ 
; 

坦率地說,我想你如果您將標籤postgres更改爲oracleplpgsqlplsql ...

相關問題