让我们用这个简单的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)
不完全是漂亮,但它的伎俩。
你也许可以通过包装函数调用中的['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不需要进行任何更改。 –