支持Oracle SQL的布尔值

8
我的一个永久的困惑是Oracle PL/SQL支持bool数据类型,而Oracle SQL不支持。当你想要将PL/SQL布尔返回值处理成日常SQL时(下面有示例),这是一个很大的问题。
即使ask-Tom网站对此不以为意,报告称应将布尔列编码为固定值'Y'/'N' CHAR列,但在许多不同层面上,这是一个非常糟糕的回答,我不知道从哪里开始批评它。实际上,这个响应唯一可取的品质是(据我最近发现),许多其他数据库引擎也不支持布尔数据类型。
无论如何-问题是...
对于以下问题,我有一个解决方法(虽然凌乱而冗长),因此我提出这个问题只是出于好奇,而不是必要性。但是,令我惊讶的少数事情之一就是聪明程序员的创造力,所以希望你们中的一个能够解决以下问题。
在以下示例中,函数stock_pkg.is_in_stock()(这是我的应用程序的固有部分)返回BOOL值,从而使SQL无效(请记住,SQL不支持BOOL):
SELECT part_no, stock_pkg.is_in_stock(part_no) in_stock
FROM   parts_table

我需要找到一种使用上述函数调用的方法,生成格式为以下字符串(varchar)输出的有效方式:
PART_NO IN_STOCK
------- ------------
AA      YES
BB      NO
CC      NO

(您可以使用“是/否”、“绿色/红色”、“托利/工党”甚至数字1/0来替代“真/假”,只要输出结果落入两个不同的类别即可。)
不幸的是,我没有特权重写原始函数以返回不同的数据类型。此外,在较大的应用程序中有数千个类似的函数散布,重新编写它们是不现实的。
因此,在这个意义上,解决方案必须是“通用”的(即不特定于此函数调用)。例如,将函数重写为stock_pkg.is_in_stock_chr()是不够的,因为那将意味着还需要重新编写应用程序中所有其他类似的函数。
我已经尝试过:
SELECT part_no,
       CASE WHEN stock_pkg.is_in_stock(part_no) THEN 'y' ELSE 'n' END in_stock
FROM   parts_table

甚至包括我自己的包装函数:

SELECT part_no,
       my_bool_to_str(stock_pkg.is_in_stock(part_no)) in_stock
FROM   parts_table

但是,即使在其他的函数结构中包装布尔值似乎也不被Oracle SQL允许(至少在Oracle 10g中不允许)。

还有一种选择是在in_stock列中编写子查询,但是在极端情况下这可能会变得过于复杂,并且还需要特定的情况。

正如我所说,我希望能在某个地方找到一个巧妙的解决方案(或者至少是我忽略的一个非常简单的解决方案)。

感谢您的时间。


我不太清楚你的问题是什么。你是否正在询问如何将SQL值返回到PL / SQL布尔数据类型中? - David Aldridge
@DavidAldridge:我想知道如何将从PL/SQL函数返回的布尔数据类型返回到普通的SQL查询中。我有一个简单的SQL查询平台,需要将这个由PL/SQL生成的布尔值返回给最终用户。 - cartbeforehorse
1个回答

6
您可以像这样编写自己的包装器:

您可以编写自己的包装器,如下所示:

CREATE OR REPLACE FUNCTION my_bool_to_str(f varchar2) RETURN VARCHAR2 IS

  b varchar2(2);

BEGIN

  EXECUTE IMMEDIATE 'declare bl boolean; begin bl := ' || f ||
                    '; if bl then :1 := ''y''; else :1 := ''n''; end if; end;'
    using out b;

  return b;

END;

然后您可以这样调用它:
SELECT part_no,
       my_bool_to_str('stock_pkg.is_in_stock('|| part_no|| ')') in_stock
FROM   parts_table

您的包装器与此不同之处在于它接收一个varchar作为输入,而不是SQL引擎无法识别的布尔值。

我认为你不能使用execute immediatedbms_sql绑定布尔值。我从中得到ORA-00457,就像我第一次尝试时一样。我是否漏掉了什么? - Alex Poole
1
你是对的,@AlexPoole,我更新了我的答案,现在应该可以工作了。 - A.B.Cade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接