我想知道我是否可以創建一個引數數量及其型別發生變化的 PL/SQL 程序。
例如程式 p1。
我可以這樣使用
p1 (param1, param2,......., param n);
我想在程序中傳遞表名和資料,但是每個表的屬性都會改變,
create or replace PROCEDURE INSERTDATA(NOMT in varchar2) is
num int;
BEGIN
EXECUTE IMMEDIATE 'SELECT count(*) FROM user_tables WHERE table_name = :1'
into num using NOMT ;
IF( num < 1 )
THEN
dbms_output.put_line('table not exist !!! ');
ELSE
dbms_output.put_line('');
-- here i want to insert parameters in the table,
-- but the table attributes are not the same !!
END IF;
NULL;
END INSERTDATA;
uj5u.com熱心網友回復:
據我所知,不,你不能。所有引數的數量和資料型別必須是固定的。
您可以將集合作為引數傳遞(并且其中包含不同數量的值),但是 - 這仍然是一個引數。
您想在哪里使用這樣的程式?
uj5u.com熱心網友回復:
如果您需要存盤、更新和查詢可變數量的資訊,我建議您切換到 Oracle 中的 JSON 查詢和物件。Oracle 對 SQL 和 PLSQL 中的 json 資料的固定和動態查詢都有深入的支持。
uj5u.com熱心網友回復:
我想在程序中傳遞表名和資料,但是每個表的屬性都會改變,
這種通用程序的問題是需要知道目標表的結構。您的方法要求呼叫者必須發現表格的投影并以正確的方式排列引數。
沒有特別的順序:
- 這是不好的做法,因為它需要呼叫程式對資料字典進行艱苦的作業。
- 此外,它還違反了得墨忒耳法則,因為呼叫程式需要了解諸如主鍵(序列、標識列等)、外鍵查找等內容
- 這種方法要求必須填充所有列;它不允許虛擬列、可選列等
- 要運行該程序,必須使用動態 SQL,這始終是一項艱巨的作業,因為它將編譯錯誤轉化為運行時錯誤,應盡可能避免。
使用針對資料字典的動態 SQL 為模式中的每個表生成專用插入程序非常簡單。這就是 Table API 的概念。它并非沒有自己的問題,但它比您的問題提出的要安全得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429537.html
下一篇:基于另一個具有日期條件的表更新表
