【发布时间】:2016-01-22 12:35:40
【问题描述】:
我的任务是改进旧的 PL/SQL 和 Oracle SQL 遗留代码。总共有大约 7000 行代码!现有代码中真正让我感到惊讶的一个方面是,之前的编码员通过不编写任何过程或函数而不必要地创建了数百行代码 - 相反,编码员基本上自始至终重复相同的代码。
例如,在现有代码中,实际上有 40 次或更多重复以下 SQL:
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.....
虽然我最近购买了 Steven Feuerstein 的优秀书籍“Oracle PL/SQL 编程”,但我对 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')已经存在;和
- 源表不存在。
书面的例外是否处理这些情况?
- 更一般地说,我可以从哪里获得 SQL 错误代码及其含义?
如果对代码提出任何改进建议,我们将不胜感激。
【问题讨论】:
-
只使用全局临时表。创建表的代码让我觉得原人对 SQL Server 很熟悉。
标签: oracle stored-procedures plsql