我想知道是否有任何方法可以使用 DEFINE 命令,我在其中執行選擇以將值傳遞給它。
例如:
DEFINE data date = select max(date_mytable) from mytable;
有沒有辦法做到這一點?
這個想法是在接下來要使用的代碼行中,我呼叫變數而不是查詢特定表的最大日期并且必須手動插入它。
我正在使用 Oracle SQL
我正在使用 SQLTools 客戶端
uj5u.com熱心網友回復:
如果您使用 PL/SQL,您可以定義變數,然后使用如下SELECT...INTO陳述句:
set serveroutput on
set feedback off
DECLARE
l_date DATE;
BEGIN
SELECT MAX (created) INTO l_date FROM all_objects;
dbms_output.put_line(l_date);
END;
/
uj5u.com熱心網友回復:
我們必須使用var[iable]而不是def[ine]宣告一個變數,因為我們不能通過使用 SELECT 陳述句來填充它=。因此,在 SQL*Plus 會話中,我們使用如下變數:
var data varchar2(8)
select to_char(max(date_mytable))
into :data
from mytable;
select count(*)
from some_other_table
where some_other_date >= to_date(:data, 'yyyymmdd');
不幸的是,SQL*Plus 沒有 DATE 資料型別,因此在型別轉換方面有額外的麻煩。
SQL*Plus 是用于處理 SQL 和 PL/SQL 的 Oracle 專有客戶端。它的語法不是由標準定義的(與 SQL 不同),因此許多 3rd 方客戶端產品不支持它,或者只支持它的一個子集。您可能會發現使用 Oracle 自己的(免費)工具(如SQL Developer或SQL CL(SQL*Plus 的現代版本))很有好處。
uj5u.com熱心網友回復:
在 SQL*Plus 中,您的特定工具可能會或可能不會完全模擬,您可以使用column x new_value y構造從查詢中定義替換變數,如下所示:
SQL> column max(object_id) new_value last_object_id
SQL> select max(object_id) from user_objects;
MAX(OBJECT_ID)
--------------
168843
1 row selected.
SQL> def last_object_id
DEFINE LAST_OBJECT_ID = 168843 (NUMBER)
這將指定的列名稱標記為替換變數進行跟蹤。
通常在腳本中,您會為列指定一個與所需變數名稱匹配的別名,以避免需要復制精確的運算式,因此您會看到類似
column today_date new_value today_date
后跟帶有別名為 的列的查詢today_date。
還要注意,它不需要是單行查詢,它只需要查詢回傳的最后一個值。
對于日期值,您必須仔細選擇格式,因為替換變數將是純文本字串而不是實際日期型別。對于沒有大量時間的日期,我建議使用'YYYY-MM-DD'format ,因為隨后在日期文字中使用它更容易使用date '&somevar':
SQL> column last_created new_value last_created
SQL> select to_char(max(created),'YYYY-MM-DD') as last_created from user_objects;
LAST_CREAT
----------
2021-12-20
1 row selected.
SQL> prompt Last object created on &last_created
Last object created on 2021-12-20
現在我們可以&last_created在日期算術中使用:
SQL> select date '&last_created' 10 from dual;
DATE'2021
---------
30-DEC-21
但是,這可能在您使用的工具中都不起作用,因為它是 SQL*Plus 客戶端功能,與 SQL 本身無關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389866.html
上一篇:函式的子查詢替代方案?
