oracle 计算公式解析,用PL/SQL如何实现公式解析计算
貼出來比較一下,我寫的比較煩瑣一點,呵呵。
我在動態SQL中寫DUAL表時,提示錯誤為:“ORA-00942: 表或視圖不存在”
換成my_dual表就可以了:create table my_dual as select * from dual;不知道樓上的咋就好使捏。。。
--第一張表的列名必須是 以字母開頭,且后面跟的全是不相等的數字
PROCEDURE xxx
IS
v_formula cal_formula_t.formula%TYPE;
n_value_new NUMBER(10,2);
v_sql_execute VARCHAR2(100);
TYPE record_value IS RECORD(
code cal_value_t.code%TYPE,
col_value??cal_value_t.col_value%TYPE
);
TYPE type_value IS TABLE OF record_value INDEX BY BINARY_INTEGER;
t_value type_value;
BEGIN
-- 1。提取第一張表的值
FOR rec_val IN ( SELECT * FROM cal_value_t ) LOOP
t_value(to_number(substr(rec_val.code, 2))).code := rec_val.code;
t_value(to_number(substr(rec_val.code, 2))).col_value := rec_val.COL_VALUE;
END LOOP;
FOR rec_value IN (SELECT a.ROWID, a.* FROM cal_value_t a) LOOP
IF rec_value.flag = 'N' THEN GOTO continue; END IF;
-- 2。查詢該字段的計算公式
BEGIN
SELECT FORMULA
INTO v_formula
FROM cal_formula_t
WHERE CODE = rec_value.CODE;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('error1:表v_formula中無該code計算公式!code= '||rec_value.code);
RETURN;
WHEN OTHERS THEN
dbms_output.put_line('error2:'||SQLERRM);
RETURN;
END;
-- 3。替換公式中的字符串
FOR i IN 1..t_value.COUNT LOOP
v_formula := REPLACE(v_formula, t_value(i).code, t_value(i).col_value);
END LOOP;
-- 4。獲取該行計算后的值
BEGIN
v_sql_execute := 'SELECT '||v_formula||' FROM my_dual';
EXECUTE IMMEDIATE v_sql_execute INTO n_value_new;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('error3:執行動態SQL失敗!錯誤原因:'||SQLERRM);
RETURN;
END;
--dbms_output.put_line(n_value_new);
-- 5。更新第一張表的列
BEGIN
UPDATE cal_value_t
SET col_value = n_value_new
WHERE ROWID = rec_value.ROWID;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('error4:更新code = '||rec_value.code||' 的值失敗!錯誤原因:'||SQLERRM);
rollback;
RETURN;
END;
<>
NULL;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('error4:執行失敗!錯誤原因:'||SQLERRM);
ROLLBACK;
END;
總結
以上是生活随笔為你收集整理的oracle 计算公式解析,用PL/SQL如何实现公式解析计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle字符集dll,VS2010+
- 下一篇: oracle查询执行过的sql语句,如何