拼接SQL語句[Oracle]
因為專案需要,有一段select語句中的列,想實現可配置,因此就需要用for迴圈。但嘗試之後發現select語句中是不允許放for迴圈的。
因此就有了本篇文章。僅是自己在做專案中的一點小心得。歡迎各位大神指正。
需求 select column1,column2,column3,column41,column42,column43,column44...... from table1 where [條件]。其中column41,column42,column43,column44......是想放在另一個表中維護的,因此這些列有可能會增加、減少、改變。
現在我們開始寫這部分程式碼。
首先我們需要定義一個變數,來存放拼接好的SQL語句。
V_SQL_STR varchar2(30000);
接下來就是拼接語句:
V_SQL_STR:=CONCAT(V_SQL_STR,'SELECT ');
V_SQL_STR:=CONCAT(V_SQL_STR,COLUMN1);
V_SQL_STR:=CONCAT(V_SQL_STR,COLUMN2);
V_SQL_STR:=CONCAT(V_SQL_STR,COLUMN3);
--開始拼接Column41往後的列
OPEN TDCV FOR --開啟遊標
SELECT ITEM_CD
FROM table2
WHERE [條件];
FETCH TDCV BULK COLLECT INTO ITEM_CDS;
CLOSE TDCV;
IF ITEM_CDS.COUNT > 0
THEN
FOR I IN ITEM_CDS.FIRST .. ITEM_CDS.LAST
LOOP
V_SQL_STR :=CONCAT (V_SQL_STR,ITEM_CDS(I)); --將查出來的符合條件的列拼接到SQL語句中
END LOOP;
END IF;
V_SQL_STR:=CONCAT(V_SQL_STR,'from table1');
V_SQL_STR:=CONCAT(V_SQL_STR,'where ');
V_SQL_STR:=CONCAT(V_SQL_STR,'[加上查詢條件]');
OPEN P_CUR FOR V_SQL_STR ; --開啟遊標,開始查詢
拼接語句,寫起來除錯比較麻煩一定要沉下心來慢慢理。
1.在拼接where條件時,如果用到時間變數,要注意時間格式以及轉換,除錯了好久這個時間條件。
2.在拼接時,有的地方輸入變數為定值,應注意單引號的使用。