Sql SELECT中某个函数的布尔返回值
我正在用PL/SQL编写一个包 这是我的规格:Sql SELECT中某个函数的布尔返回值,sql,oracle,plsql,boolean,plsql-package,Sql,Oracle,Plsql,Boolean,Plsql Package,我正在用PL/SQL编写一个包 这是我的规格: TYPE outrec IS RECORD( tw_m_id NUMBER, tw_m_dealer_id NUMBER, tw_number NUMBER, check_uid NUMBER); TYPE outrecset IS TABLE
TYPE outrec IS RECORD(
tw_m_id NUMBER,
tw_m_dealer_id NUMBER,
tw_number NUMBER,
check_uid NUMBER);
TYPE outrecset IS TABLE OF outrec;
FUNCTION report
(
p_watermark IN NUMBER,
p_param IN NUMBER,
p_index IN NUMBER
) RETURN outrecset
PIPELINED;
这是我的身体:
FUNCTION func
(
p_watermark => p_watermark,
p_param => p_param,
p_index => p_index
)
RETURN outrecset
PIPELINED IS
temp outrec;
BEGIN
before_report(p_watermark => p_watermark,
p_param => p_param,
p_index => p_index);
FOR c_rec IN (SELECT tw_m_id,
tw_m_dealer_id,
tw_number,
package_name.somefunction(tw_number) AS check_uid
FROM table1
JOIN table2 rk ON id1 = rk.id2
WHERE 1 = 1
AND id1 = rk.id2
AND id1 = p_param)
LOOP
temp.tw_m_tw_rechnungskopf_id := c_rec.tw_m_tw_rechnungskopf_id;
temp.tw_m_haendler_id_rechnung := c_rec.tw_m_haendler_id_rechnung;
temp.check_uid := c_rec.check_uid;
PIPE ROW(temp);
END LOOP;
END;
我正在尝试从包名中获取值。somefunctiontw\u number作为check\u uid。问题是somefunction返回布尔值。
当我将check_uid设置为BOOLEAN时,我得到错误:PLS-00382:表达式的类型错误,因为SQL当然不支持BOOLEAN。我试过:
CASE
WHEN package_name.somefunction(tw_number) THEN true
else false
END as check_uid
在SELECT中,我得到错误:PL/SQL:ORA-00920:无效的关系运算符
有人能告诉我如何做到这一点吗?PL/SQL不是我的强项:
编辑:对于示例varchar2,我无法更改somefunction以返回它需要保持原样
通常,您会在包中创建一个重载函数,该函数返回1/0或Y/N。但由于您无权访问该包,因此可以在sql查询中使用内联函数来完成此操作
create or replace function func (parameter_i VARCHAR2) RETURN BOOLEAN
AS
BEGIN
return true;
END;
/
WITH
FUNCTION func_yn(parameter_i VARCHAR2)
RETURN NUMBER
IS
l_return_value BOOLEAN;
BEGIN
l_return_value :=func(parameter_i => parameter_i);
RETURN CASE l_return_value WHEN TRUE THEN 1 WHEN FALSE THEN 0 END;
END func_yn;
SELECT
func_yn('test')
FROM dual;
编写一个简单的包装函数,将PL/SQL布尔值转换为在SQL中有效的数字数据类型,该数据类型符合记录类型的要求,并且可以将函数调用移到SQL之外 在布尔返回数中创建函数映射 是 开始 返回案例真实性 如果为真,则为1 如果为FALSE,则为0 否则无效 终止 端点映射; / 因此,您的规格是: 创建包\u名称为 类型outrec是记录 tw_m_id号, tw_m_经销商识别号, tw_编号, 检查uid号码 ; 类型outrecset是outrec的表格; -注意:这可能在另一个包装中,但在这里是为了方便。 数字返回布尔值中的函数somefunctionvalue; 功能报告 p_水印的数字, p_参数的数量, p_指数 回流出口管道化; 终止 / 相应的机构将是: 创建包体包_名称为 数字返回布尔值中的函数somefunctionvalue 是 开始 返回TRUE; 终止 报告前的程序 p_水印的数字, p_参数的数量, p_指数 是 开始 无效的 终止 功能报告 p_水印的数字, p_参数的数量, p_指数 返回输出流水线 是 温度输出; 开始 报告前 p_水印=>p_水印, p_参数=>p_参数, p_指数=>p_指数 ; 对于c_rec IN 选择tw_m_id, tw_m_经销商id, tw_编号 来自表1 在id1上连接表2 rk=rk.id2 其中id1=p_参数 环 temp.tw_m_id:=c_rec.tw_m_id; temp.tw_m_dealer_id:=c_rec.tw_m_dealer_id; temp.check\u uid:=映射布尔值 软件包\u NAME.SOMEFUNCTION c\u rec.tw\u编号 ; 管道温度; 端环; 终止 终止 / 注意:您还需要更新游标循环,因为您选择的值与记录的字段不匹配
DBFIDLE非常感谢这解决了我的问题:D