2010-12-03 49 views
1

我目前正在使用oracle數據庫自動創建存儲過程和函數的過程 我正在使用java來自動創建存儲過程的過程,例如當我給出表名稱時,java代碼將產生程序:Oracle商店程序自動化

  • 選擇
  • 插入
  • 更新
  • 刪除

,並放置在文本文件

例如

select * from emp where emp_id=i_emp_id and emp_nm=i_emp_nm and emp_dpt=i_emp_dpt 

如果所有的三個輸入不爲空它應有的功能就像

select * from emp where emp_id=i_emp_id and emp_nm=i_emp_nm and emp_dpt=i_emp_dpt 

如果我通過i_emp_id爲null,則查詢應功能如

select * from emp where emp_nm=i_emp_nm and emp_dpt=i_emp_dpt 

if i pa SS i_emp_id爲空和i_emp_dpt爲null,則查詢應像

select * from emp where emp_nm=i_emp_nm 

相若方式的更新功能等

already posted a question on this

能否請您給我一些通用查詢,以 選擇 插入 更新 和刪除

我對存儲過程的輸入可能會因爲空值或實際值而變化

回答

3

表API的問題是有問題的。一方面,他們可以防止SQL語句嵌入整個應用程序。另一方面,它們可能會導致一種不良實踐的文化,因爲它們可以讓開發人員獲得對數據庫的真正理解。

無論哪種方式,這是一大塊你正在咬的工作。它需要對Oracle,SQL和PL/SQL有很多的理解才能做到。而一個不完整的解決方案將是無用的。也許比無用的更糟糕。

所以,不要自己寫這個。領先的PL/SQL專家Steven Feuerstein編寫了一個複雜的實用程序來生成Table API:Quest Code Generation Utility(以前稱爲QNXO)。它從Quest網站免費。 Find it here。它不是用Java編寫的,但那又如何?

+0

但仍然爲了我的知識和理解,我需要知道這些事情。感謝您的鏈接 – Aravind 2010-12-03 07:29:08

+0

@Aravind - 但首先您需要對Oracle SQL有足夠的瞭解,以評估您獲得的任何響應。我在回答你的其他問題時提出了這一點。 – APC 2010-12-03 07:34:59

0

我不確定你想要的東西會證明是有用的,但是如果你想要生成插入,更新或刪除語句,最好了解視圖all_tab_columns和user_tab_columns。插入的

例子:

select 'insert into ' || :table_name || ' (' qry 
from dual 
union all 
select column_name || ', ' 
from user_tab_columns 
where table_name = :table_name 
union all 
select ') values (' 
from dual 
union all 
select ':' || column_name || ', ' 
from user_tab_columns 
where table_name = :table_name 
union all 
select ')' 
from dual 
-1

有很多方法來解決這個問題。

根據參數的數量及其類型,一種解決方案是overload different code

另一種解決方案是使用一套固定的參數並沒有對空濾....

select * 
from emp 
where emp_id=NVL(i_emp_id, emp_id) 
and emp_nm=NVL(i_emp_nm, emp_nm) 
and emp_dpt=NVL(i_emp_dpt, emp_dpt); 

或者你可以創建查詢爲PL/SQL中的字符串,並使用「EXECUTE IMMEDIATE」 ...

PROCEDURE finder (
     i_emp_id IN emp.emp_id%TYPE, 
     i_emp_nm IN emp.emp_nm%TYPE DEFAULT NULL, 
     i_emp_dpt IN emp.emp_dpt%TYPE DEFAULT NULL, 
     .... 
    ) 
IS 
    l_qry VARCHAR2(1000) := 'SELECT * FROM emp WHERE 1=1'; 
BEGIN 
    IF (i_emp_nm IS NOT NULL) 
    THEN 
     l_qry := l_qry || ' AND emp_nm=' || i_emp_nm; 
    IF (i_emp_dpt IS NOT NULL) 
    THEN 
     l_qry := l_qry || ' AND emp_dpt=' || i_emp_dpt; 
    EXECUTE IMMEDIATE l_qry; 
....