大家好:
我想問我有一個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;
但他一直錯誤......
請問是哪邊語法錯了?
基本上樓主的需求與貼文基本上是"文不對題".
當然會找不到好的解答.
有二種做法可以逹到需求:
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
以上範例,供樓主參考.
要注意網頁端的呼叫方式.
DECLARE
SUM_A NUMBER; --不需要
BEGIN
SUM_A := price * num; --不需要
SELECT pen,
price,
num,
price*num
FROM sale
WHERE price*num > 100;
END;
Oracle 的 SUM 是保留字請謹記。
尼克你好
SUM 是保留字請謹記,了解了
想請教那設變數的話要怎麼弄
因為我真正要算的算式並不是price*num這麼簡短
我的算式有複雜,而且要運算的答案不只一個.....
我不想要程式碼拖那麼長..
所以想了解變數的寫法
謝謝
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 方式到變數。
我都是用基本方式,推薦你要拿一本來看。
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.
想問大大為什麼我這樣寫會錯.....
SELEC 幾個值,INTO 就要幾個值。
趕快買一本書來看吧!SQL 深入淺出
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;
尼克
我試了一下還是不行耶....
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
where v_a>100
應該不只一個值吧
v_a只能放一個值
除非你要清除v_a值
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就可以解決的.
幸運叔祝大家平安喜樂.
table
Num, PRICE, QUANTITY
筆,價格,數量
A , 20, 5
B, 24 ,3
SELECT Num,
PRICE,
QUANTITY,
PRICE * QUANTITY TOTAL
FROM TABLE
WHERE PRICE * QUANTITY > 100