我的一个永久的困惑是Oracle PL/SQL支持bool数据类型,而Oracle SQL不支持。当你想要将PL/SQL布尔返回值处理成日常SQL时(下面有示例),这是一个很大的问题。
即使ask-Tom网站对此不以为意,报告称应将布尔列编码为固定值'Y'/'N' CHAR列,但在许多不同层面上,这是一个非常糟糕的回答,我不知道从哪里开始批评它。实际上,这个响应唯一可取的品质是(据我最近发现),许多其他数据库引擎也不支持布尔数据类型。
无论如何-问题是...
对于以下问题,我有一个解决方法(虽然凌乱而冗长),因此我提出这个问题只是出于好奇,而不是必要性。但是,令我惊讶的少数事情之一就是聪明程序员的创造力,所以希望你们中的一个能够解决以下问题。
在以下示例中,函数stock_pkg.is_in_stock()(这是我的应用程序的固有部分)返回BOOL值,从而使SQL无效(请记住,SQL不支持BOOL):
我需要找到一种使用上述函数调用的方法,生成格式为以下字符串(varchar)输出的有效方式:
(您可以使用“是/否”、“绿色/红色”、“托利/工党”甚至数字1/0来替代“真/假”,只要输出结果落入两个不同的类别即可。)
不幸的是,我没有特权重写原始函数以返回不同的数据类型。此外,在较大的应用程序中有数千个类似的函数散布,重新编写它们是不现实的。
因此,在这个意义上,解决方案必须是“通用”的(即不特定于此函数调用)。例如,将函数重写为
我已经尝试过:
即使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
列中编写子查询,但是在极端情况下这可能会变得过于复杂,并且还需要特定的情况。
正如我所说,我希望能在某个地方找到一个巧妙的解决方案(或者至少是我忽略的一个非常简单的解决方案)。
感谢您的时间。