我的任務是改進舊的PL/SQL和Oracle SQL遺留代碼。總共有大約7000行代碼!現有代碼的一個方面讓我非常驚訝,以前的編碼器通過不編寫任何過程或函數而不必要地創建了數百行代碼 - 相反,編碼器實質上始終重複相同的代碼。PL/SQL存儲過程創建表
例如,在現有的代碼字面上有以下SQL的40或更多次的重複:
CREATE TABLE tmp_clients
AS
SELECT * FROM live.clients;
CREATE TABLE tmp_customers
AS
SELECT * FROM live.customers;
CREATE TABLE tmp_suppliers
AS
SELECT * FROM live.suppliers WHERE type_id = 1;
and many, many more.....
我很新在PL/SQL寫,但我最近購買的優秀圖書Steven Feuerstein的「Oracle PL/SQL編程」。然而,據我所知,我應該能夠編寫一個可調用的程序,例如:
procedure create_temp_table (new_table_nme in varchar(60)
source_table in varchar(60))
IS
s_query varchar2(100);
BEGIN
s_query := 'CREATE TABLE ' + new_table_nme + 'AS SELECT * FROM ' + source_table;
execute immediate s_query;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL;
ELSE
RAISE;
END IF;
END;
然後,我會簡單地調用過程如下:
create_temp_table('tmp.clients', 'live.clients');
create_temp_table('tmp.customers', 'live.customers');
- 是我的建議鑑於上述問題,合理的方法?
- 過程調用中的數據類型是否合理,即應該使用varchar2(60),還是可以強制'source_table'參數成爲模式中的表名稱?如果表名超過60個字符會發生什麼?
- 我希望能夠通過第三個非必需參數的情況下,數據必須在一個微不足道的限制,即處理案件「WHERE type_id = 1」。如何修改過程以包含僅偶爾使用的參數以及如何修改其餘代碼。我可能會添加某種IF/ELSE語句來檢查第三個參數是否不爲NULL,然後相應地構造s_query。
- 如何檢查表格是否已成功創建?
我想陷阱其他兩個例外,即
- 新表(如「tmp.clients」)已經存在;和
- 源表不存在。
作爲書面處理的EXCEPTION是否處理這些情況?
- 更一般地說,從哪裏可以獲得SQL錯誤代碼及其含義?
任何建議對代碼的改進都會非常感激地收到。
只是使用全局臨時表。創建表的代碼讓我認爲原始人熟悉SQL Server。 – kevinsky