我被委托改进旧的PL/SQL和Oracle SQL遗留代码。总共大约有7000行代码!现有代码中让我非常惊讶的一个方面是,以前的编码人员通过不编写任何过程或函数来不必要地创建了数百行代码 - 相反,编码人员基本上在整个代码中重复相同的代码。
例如,在现有代码中,以下SQL文字实际上被重复了40次或更多:
我会简单地调用以下过程:
例如,在现有代码中,以下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 programming"。根据我的理解,我应该能够编写一个可调用的存储过程,例如:
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语句来检查第三个参数是否不为空,然后相应地构造s_query。
- 如何检查表是否已成功创建?
- 我想捕获两个其他异常,即
- 新表(例如'tmp.clients')已经存在;和
- 源表不存在。
所写的EXCEPTION是否处理这些情况?
- 更普遍地说,我从哪里可以获取SQL错误代码及其含义?
如有建议改进代码,将不胜感激。