0

我这里有一个情况,我们正在从 Oracle 迁移到 EDB POSTGRES ADVANCED SERVER(ORACLE COMPATIBLE)。我将分享一个示例程序(在我们的组织程序中到处都使用相同的方法)。

CREATE OR REPLACE PROCEDURE get_emp(
OUT dataset refcursor,
jb character varying)
LANGUAGE 'edbspl'

AS $BODY$

STR VARCHAR2(32000) ;
BEGIN
STR := 'SELECT * FROM EMP WHERE JOB='''||JB||'''  ';

DBMS_OUTPUT.PUT_LINE ( STR ) ;
OPEN DATASET FOR STR ;

END GET_EMP$BODY$;

此过程编译成功。但是当我调用程序时

SELECT GET_EMP('CLERK');

结果就像

"<unnamed portal 1>"

在此之后我要做的是

begin;
SELECT GET_EMP('CLERK');
fetch all in "<unnamed portal 1>";

这次我得到了想要的输出。有什么方法可以通过调用如下的过程来获取记录

SELECT GET_EMP('CLERK');
4

1 回答 1

0

您的过程容易受到 SQL 注入的攻击。refcursors此外,为什么如果你想要的只是胡说八道:

CREATE FUNCTION get_emp(jb text) RETURNS SETOF emp
   LANGUAGE sql AS
'SELECT * FROM emp WHERE job = jb';
于 2018-12-10T12:52:50.930 回答