如何解决在 Oracle 变量中保留公式
我有一个具有如下查询的过程:
amtTotal number := 0;
amtTotal := round((obj.amount * days) / obj.daysNo);
所以我想要的是保留这个东西 - round((obj.amount * days) / obj.daysNo) 作为表格列中的公式并检索如下:
AMT_NEW VARCHAR2(100);
SELECT M.FORMULA_REF INTO AMT_NEW FROM TableName m WHERE M.TYPE = '1';
amtTotal := AMT_NEW;
我知道,这很奇怪并抛出以下异常:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
有什么办法可以让它工作或运行公式将其保存在变量中进行计算?
解决方法
您正在将 varchar2
变量中的公式分配给 number
变量。
您真正想要的是评估 varchar2
变量的内容并将结果分配给 number
变量。为此,您需要动态 sql。
第二个问题是你的表达式中有变量,你需要在运行动态 SQL 时传递这些变量的值。动态 SQL 不知道过程的上下文,因此无法引用过程中的变量。
要计算字符串表达式并将结果作为数字返回,您可以使用以下函数。但这并没有考虑到变量:
CREATE OR REPLACE FUNCTION eval_num(p_string VARCHAR2)
RETURN NUMBER
AS
l_result NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT (' || p_string || ') FROM dual'
INTO l_result;
RETURN l_result;
END;
/
因此,SELECT eval_num('2*3') FROM DUAL;
之类的内容返回 6,但您可以不能在表达式中使用 obj.amount
或 obj.daysNo
。
实际上,我会将其写为注释,但文本太长,格式会更糟。 :-)
,从您的问题中不清楚存储表达式的输入是什么。如果它们都来自同一个表,那么你可以定义一个虚拟列:
create table tablename
( amount number,days number,daysno number,formula_ref generated always as ((amount * days) / daysNo) );
insert into tablename(amount,days,daysno)
values (100,5,2);
select * from tablename;
AMOUNT DAYS DAYSNO FORMULA_REF
---------- ---------- ---------- -----------
100 5 2 250
如果它们来自不同的表,您可以创建一个连接它们并包含公式的视图。
如果它们是 PL/SQL 变量,您可以定义一个函数或一个对象类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。