2017-09-22 86 views
1

我有一个要求迁移Oracle数据库到Postgres的,在我能够做到这一点。 通过使用FDW,我可以在Postgres访问Oracle数据。 现在有来电/通过Postgres的执行甲骨文的功能要求。有没有办法通过Postgres调用/执行Oracle函数?

有没有办法做到这一点?

我发现这个环节,对于相同的: https://github.com/laurenz/oracle_fdw/issues/187

任何一个可以为我提供的样品或一个例子吗?

问候,

+0

你也许可以通过包装函数调用中的['plpythonu'(https://www.postgresql.org/docs/current/static/plpython.html)或['plperlu'(做到这一点很容易https://www.postgresql.org/docs/current/static/plperl.html)函数。或者,您可以编写一些脚本,从stdin接受它的参数并通过['COPY TO PROGRAM'](https://www.postgresql.org/docs/current/static/sql-copy.html)调用它。您需要超级用户权限才能执行上述任何操作。与Laurenz的FDW方法不同,您在Oracle方面失去了交易完整性。但Oracle不需要进行任何更改。 –

回答

2

让我们用这个简单的Oracle功能测试目的:

CREATE OR REPLACE FUNCTION double(n NUMBER) RETURN NUMBER AS 
BEGIN 
    RETURN n * 2; 
END; 
/

然后,我们可以用oracle_fdw使用Oracle表:

CREATE TABLE call_double(inp NUMBER, outp NUMBER); 

INSERT INTO call_double VALUES (1, 1); 

COMMIT; 

现在我们创建一个BEFORE引发这样的:

CREATE TRIGGER double_trig BEFORE UPDATE ON call_double FOR EACH ROW 
BEGIN 
    :NEW.outp := double(:NEW.inp); 
END; 
/

现在,我们可以创建和PostgreSQL的使用外部表:

CREATE FOREIGN TABLE call_double(
    inp numeric OPTIONS (key 'true'), 
    outp numeric) 
SERVER oracle OPTIONS (table 'CALL_DOUBLE'); 

UPDATE call_double SET inp = 12 RETURNING outp; 

┌──────┐ 
│ outp │ 
├──────┤ 
│ 24 │ 
└──────┘ 
(1 row) 

不完全是漂亮,但它的伎俩。

相关问题