我的任务是改进旧的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