我一直感到沮丧的是,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
列内编写子选择,但是在极端示例中,这也可能会变得过于复杂,并且会因具体情况而异。
正如我所说,我希望某个地方有一个巧妙的解决方案(或者至少是我碰巧忽略的一个非常简单的解决方案)。
谢谢你的时间。
您可以这样编写自己的包装器:
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引擎无法识别的布尔值
我正在尝试使用thymeleaf将一个简单的表单发布到spring控制器。backing bean包含一个布尔值,该值使用th:object标记中的th:field映射到模板中的复选框。当我查看呈现的html DOM时,spring mvc添加了一个隐藏的输入字段,其名称是_attributeName。主输入字段的名称生成为AttributeName。现在,当Iam试图发布表单时,它会用400中止
本文向大家介绍Dubbo支持分布式事务吗?相关面试题,主要包含被问及Dubbo支持分布式事务吗?时的应答技巧和注意事项,需要的朋友参考一下 目前暂时不支持,后续可能采用基于 JTA/XA 规范实现,如以图所示。
3.4. 布尔型 一个布尔类型的值只有两种:true和false。if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。一元操作符!对应逻辑非操作,因此!true的值为false,更罗嗦的说法是(!true==false)==true,虽然表达方式不一样,不过我们一般会采用简洁的布尔表达式,就像用x来表示x==true。 布尔值可以和&&(AND)和||(OR)操作
bool: 可能的取值为常量值true和false. 支持的运算符: !逻辑非 && 逻辑与 || 逻辑或 == 等于 != 不等于 备注:运算符&&和||是短路运算符,如f(x)||g(y),当f(x)为真时,则不会继续执行g(y)。
Pascal提供数据类型Boolean,使程序员能够定义,存储和操作逻辑实体,例如常量,变量,函数和表达式等。 布尔值基本上是整数类型。 布尔类型变量有两个预定义的可能值True和False 。 解析为布尔值的表达式也可以分配给布尔类型。 Free Pascal还支持ByteBool , WordBool和LongBool类型。 它们分别是Byte,Word或Longint类型。 值False等于
我公开了一个使用另一个SOAP服务的服务。我得到了JAXB生成的服务模型。当我使用服务时,数据被设置到与此模型相关的对象中。我定义了自己的域模型,它与JAXB模型具有完全相同的类集,但没有xml注释等。我使用dozer来执行数据映射。当标记为注释(nillable=true)的某些布尔元素为null时,我的域模型中的目标对象布尔对象将设置为默认的true或false值。我希望它保留相同的空值。布尔