iT邦幫忙

1

oracle sql 設變數問題

sql
cool3690 1 月前5582 瀏覽

大家好:
我想問我有一個table(只能查詢,不能增加欄位)
筆,價格,數量
A , 20, 5
B, 24 ,3
......
我想再查詢那邊設一個sum的變數(如下)

DECLARE 
total number; 
begin
total:=price*num;
select pen,price,num, total
from sale   where total>100;
end;

但他一直錯誤......
請問是哪邊語法錯了?

做工仔人! iT邦高手 1 級 ‧ 1 月前 檢舉
樓主, 您舉的例子不好,所以大家不知從何解起.
以例子而言:sum:=price*num; 以這行而言,只有定義sum(先不管是不是保留字的問題) ,但是price 及 num 並沒有被定義到.系統根本不知要從那裡取這二個變數的值.當然會報錯啊!!
樓主, 您要的功能是: procedures 還是function ? 是很單純是在: sql plus 下手動執行 ?
希望逹到的效果是什麼?(最好是實際需求的例子)
這樣才會比較好幫忙.
cool3690 iT邦新手 4 級 ‧ 1 月前 檢舉
做工仔人!你好

price和num我是想讓他在資料庫直接抓值,
相乘或做其他計算後存入total(我以為我select後他就會自動帶入值....
這樣該怎麼做?
我是要做網頁給user查詢
(EKB,但我們公司沒簽維護,不給問.....有些選項明明就有,但查詢卻查不到....
user可以選total和大小於選項,並在框格中打100
他就會顯示>100元的訂單這樣
0
做工仔人!
iT邦高手 1 級 ‧ 1 月前
最佳解答

基本上樓主的需求與貼文基本上是"文不對題".
當然會找不到好的解答.
有二種做法可以逹到需求:
1.在網頁程式中,組好SQL 語法後,再傳給DB connection 去找資料庫要資料.
2.在Oracle 資料庫中寫一段 procedures , 再由網頁也是透過DB connection 方式將"值"傳給 procedures .再由 procedures 將查詢到的 record set 傳回給網頁.
這二種方式其實差異不大.差的只是SQL 語法寫在那裡.
第二種方式的參考資料:
CREATE OR REPLACE PROCEDURE sp_stdcost_qry(vima01 VARCHAR2, RESULT OUT SYS_REFCURSOR) IS
v_sql VARCHAR2 (6000);
BEGIN
v_sql := ' select ima01,ima021,ima02,ima06,ima25
from ima_file
where IMAACTI = ''Y''
' ;
if vima01 is not null then
v_sql :=v_sql || ' and ima01 like ''' || replace(vima01,'*','%') ||'%''';
end if;
dbms_output.put_line(v_sql);

OPEN RESULT FOR v_sql ;

EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN OTHERS
THEN RAISE;

end;

vima01 : 傳入值.
RESULT : 傳回的record set
以上範例,供樓主參考.
要注意網頁端的呼叫方式.

cool3690 iT邦新手 4 級 ‧ 1 月前 檢舉

謝謝,我再研究看看

0
尼克
iT邦高手 1 級 ‧ 1 月前
DECLARE
   SUM_A   NUMBER;  --不需要
BEGIN
   SUM_A := price * num;  --不需要

   SELECT pen,
          price,
          num,
          price*num
     FROM sale
    WHERE price*num > 100;
END;

Oracle 的 SUM 是保留字請謹記。

看更多先前的回應...收起先前的回應...
cool3690 iT邦新手 4 級 ‧ 1 月前 檢舉

尼克你好
SUM 是保留字請謹記,了解了
想請教那設變數的話要怎麼弄
因為我真正要算的算式並不是price*num這麼簡短
我的算式有複雜,而且要運算的答案不只一個.....
我不想要程式碼拖那麼長..
所以想了解變數的寫法
謝謝

尼克 iT邦高手 1 級 ‧ 1 月前 檢舉
DECLARE
   v_a NUMBER;
   v_b NUMBER;
   v_c NUMBER; 
BEGIN

   SELECT pen,
          price,
          num
     INTO v_a, v_b, v_c
     FROM sale;
END;

要用INTO 方式到變數。
我都是用基本方式,推薦你要拿一本來看。

cool3690 iT邦新手 4 級 ‧ 1 月前 檢舉

尼克

DECLARE
   v_a NUMBER;
BEGIN
v_a:= price*num;
   SELECT pen,
          price,
          num
     INTO v_a
     FROM sale
     where v_a>100;
END;
錯誤報告 -
ORA-01403: 找不到資料
ORA-06512: 在 line 5
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.

想問大大為什麼我這樣寫會錯.....

尼克 iT邦高手 1 級 ‧ 1 月前 檢舉

SELEC 幾個值,INTO 就要幾個值。
趕快買一本書來看吧!SQL 深入淺出

尼克 iT邦高手 1 級 ‧ 1 月前 檢舉
DECLARE
   v_a NUMBER;
   v_b NUMBER;
   v_c NUMBER; 
   v_d NUMBER;
BEGIN

   SELECT pen,
          price,
          num
     INTO v_a, v_b, v_c
     FROM sale WHERE v_a > 100;
     v_d := v_b * v_c
END;
cool3690 iT邦新手 4 級 ‧ 1 月前 檢舉

尼克
我試了一下還是不行耶....

select* from ecm_file;
DECLARE 

v_a NUMBER;
v_b NUMBER;
v_c NUMBER; 
v_d NUMBER; 
begin

select ecm01,ecm62,ecm63 INTO  v_a,v_b,v_c
from ecm_file  where v_a>0
 v_d := v_b* v_c;
end;
/////////////////////////////////
PL/SQL: ORA-00933: SQL 命令的結束有問題
ORA-06550: 第 9 行, 第 1 個欄位: 
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我想請教
v_a > 100;
v_d := v_b * v_c
這關聯是...
v_d會把值存到v_a的意思嗎?
為何不是
v_d > 100;
v_d := v_b * v_c

0
一級屠豬士
iT邦新手 4 級 ‧ 1 月前
create table x170802b (
  pen char(1) not null
, price int not null
, qty int not null  
);

insert into x170802b values
('A', 20, 5),
('B', 24, 3),
('C', 30, 5),
('D', 90, 1);

select pen
     , price
     , qty
  from x170802b
 where price * qty > 100; 

 pen | price | qty 
-----+-------+-----
 C   |    30 |   5
(1 row)

這個是SQL解法,完全不需要再使用變數.
上面那個PL/SQL 是錯誤的, 因為select into 變數,那變數無法被where使用.
需要下面再接一道查詢,那也是浪費執行時間與效率,還不如用subquery.
比較簡單跟直接的方式,已經貼給你看了.
先把PL/SQL, SQL 分清楚,很多問題根本不需使用PL/SQL就可以解決的.
幸運叔祝大家平安喜樂.

cool3690 iT邦新手 4 級 ‧ 1 月前 檢舉

你好:
我上面留言有說過囉
因為我真正要算的算式並不是price*num這麼簡短
我的算式有複雜,而且要運算的答案不只一個.....
我不想要程式碼拖那麼長..
所以想了解變數的寫法
謝謝

我要發表回答

立即登入回答