我有一個程式,它運行良好,其他應用程式想要使用它。
如您所見,表名和列名被硬編碼到程序中,這使得共享代碼變得困難。有沒有辦法可以重寫它以便共享。如果可能,我想避免傳入更多值,因為它會使代碼變得笨拙和笨拙。
任何建議將不勝感激。
SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';
CREATE table t(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
c CLOB,
create_date DATE DEFAULT SYSDATE
);
/
insert into t (c) values (
rpad('X',20,'X')
);
/
create or replace procedure lob_append( p_id in number, p_text in varchar2 )
as
l_clob clob;
l_text varchar2(32760);
l_system_date_time VARCHAR2(50);
begin
select c into l_clob from t where seq_num = p_id for update;
SELECT TO_CHAR (SYSDATE, 'MMDDYYYY HH24:MI:SS') into l_system_date_time from dual;
-- newline each time code is appended for clarity.
l_text := chr(10) || p_text || chr(10) || '['||l_system_date_time||']'||chr(10);
dbms_lob.writeappend( l_clob, length(l_text), l_text );
end;
/
exec lob_append(1, rpad('Z',20,'Z'));
exec lob_append(1, rpad('Y',10,'Y'));
select * from t;
/
uj5u.com熱心網友回復:
不要SELECT從程式中的表中取出,而是將其傳遞CLOB到程式中;這樣你就不需要在程序中使用動態 SQL:
CREATE PROCEDURE lob_append(
p_clob IN OUT CLOB,
p_text IN VARCHAR2
)
AS
l_text varchar2(32760);
BEGIN
-- newline each time code is appended for clarity.
l_text := chr(10)
|| p_text || chr(10)
|| '['||TO_CHAR (SYSDATE, 'MMDDYYYY HH24:MI:SS')||']'||chr(10);
dbms_lob.writeappend(p_clob, length(l_text), l_text );
END;
/
然后,當你想呼叫它時:
DECLARE
l_clob CLOB;
BEGIN
SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE;
lob_append(l_clob, rpad('Z',20,'Z'));
END;
/
DECLARE
l_clob CLOB;
BEGIN
SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE;
lob_append(l_clob, rpad('Y',10,'Y'));
END;
/
db<>在這里擺弄
uj5u.com熱心網友回復:
我是這樣理解這個問題的。
有沒有辦法可以重寫它以便共享。
是的,通過使用動態 SQL。您將需要的所有陳述句組合到一個varchar2區域變數中,然后使用execute immediate. 這意味著您實際上必須將表/列名稱傳遞到程序中,以便您能夠以“通用”方式使用它們。
注意 SQL 注入,即壞人可能會嘗試濫用該代碼。閱讀有關DBMS_ASSERT包的更多資訊。
如果可能,我想避免傳入更多值,因為它會使代碼變得笨拙和笨拙。
嗯,這與你必須做的正好相反。如果程序必須是“通用的”,則必須傳遞表/列名稱(正如我已經說過的),因此這意味著比您現在擁有的引數更多。
這值得么?我不喜歡動態 SQL。雖然它看起來“解決”了一些問題,但它帶來了另一個問題。代碼難以維護和除錯。基本上,天下沒有免費的午餐。有好處,也有缺點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333120.html
