2013-03-06 23 views
1

我想动态调用返回一个布尔值没有运气的PL/SQL方法。我一直在寻找答案,但似乎这是不可能的。动态pl/sql调用返回非SQL类型

这里是什么,我试图做一个很简单的例子:

create or replace 
function test_ret_bool return boolean as 
begin 
    return true; 
end test_ret_bool; 

,然后调用:

declare 
    ret_val boolean; 
    sql_stmt varchar2(1000); 
begin 
    sql_stmt := 'select test_ret_bool() from dual'; 
    execute immediate sql_stmt into ret_val; 
end; 

这不起作用,生成错误:

ORA-06553: PLS-382: expression is of wrong type 

另外我试着改变sql_stmt为:

sql_stmt := 'begin :result := test_ret_bool(); end;'; 
execute immediate sql_stmt using out ret_val; 

调用然后PL/SQL引擎,但它给出了这个错误:

PLS-00457: expressions have to be of SQL types 

我见过的描述相同问题的其他线程,并可能使用的包装功能。在我的情况下,我不可能使用包装函数。

我已经看到了一些关于使用dbms_sql.execute()这个可能的想法,但还没有得到它的工作。

任何人都可以请指教?有人可以提供一个使用dbms_sql.execute()的例子吗?

非常感谢!

+0

为什么你不能使用包装?这个工程 - http://www.sqlfiddle.com/#!4/e2a00/4 – 2013-03-06 13:01:14

+0

哪个版本的oracle? – TechDo 2013-03-06 13:01:21

+0

@ A.B.Cade这是一个可行的解决方案,请发布。 – TechDo 2013-03-06 13:08:20

回答

1

你的函数没问题,问题是Oracle不支持SQL中的boolean数据类型。如果你想这样做,你必须使用纯粹的PL/SQL(如A.B.Cade的SQLfiddle),或者将布尔转换为Y/N,1/0或类似形式。

您可以看到支持的数据类型here

+1

请注意,在Oracle中SQL和PL/SQL是不同的语言,支持不同的类型。 PL/SQL支持布尔值,而SQL不是一个例子。 PL/SQL的最大VARCHAR2大小为32767,而SQL的最大大小为4000.存在其他差异。 – 2013-03-06 13:34:28

+0

是的,我明白,但我希望我可以通过使用PL/SQL引擎或其他东西,或dbms_sql.execute()来实现这一点。如果'1'返回true,我的代码就会乱七八糟,否则返回false ...因为代码库的其余部分正在期待布尔运算符。所以我试图避免这个混乱。 – lostdorje 2013-03-06 13:35:09

-2

这是相同的。什么尝试做:

SELECT * FROM dual WHERE 1=1; -- TRUE 

SELECT * FROM dual WHERE 1=2; -- FALSE 
+1

OP想要在SQL中返回布尔值。这些查询分别返回* *和*空集*,这是不相关的。 – APC 2013-03-06 15:08:37

+0

@@ APC - 也许OP会觉得这很有用,因为我很清楚OP是一名初学者,正在寻找所有可能的信息和例子。而我仍然不知道OP是什么意思:) – Art 2013-03-06 15:18:12

2

您可以使用Oracle的功能SYS.DIUTIL.bool_to_intSYS.DIUTIL.int_to_bool

+2

这只是一个已经提出的包装的变种,OP认为它们不能使用。 – APC 2013-03-06 15:06:01

+2

然而,应该提到的是,不应该写这样的包装,因为它们已经存在于Oracle中。 – 2013-03-06 15:13:57

+0

这是一个公平的观点 – APC 2013-03-06 17:53:53