Chinaunix

标题: 使用DECLARE 當SELECT WHERE 條件? [打印本页]

作者: hartball38    时间: 2014-08-27 16:56
标题: 使用DECLARE 當SELECT WHERE 條件?
本帖最后由 hartball38 于 2014-08-29 13:44 编辑

您好:
請問
若有一個表格:
CREATE TABLE student (
  id smallint PRIMARY KEY,
  first_name VARCHAR(80) NOT NULL,
  last_name VARCHAR(80) NOT NULL);

insert into student VALUES(10,'AA','A01');
insert into student VALUES(30,'BB','B01');


---MSSSQL  OK
declare @v_first  varchar(10);
set @v_first='AA';
select * from student where first_name=@v_first;

但是在ORACLE, 該如何來用呢?
---以下語法錯誤...
declare v_first varchar2(10);
BEGIN
  v_first :='AA';
  select * from student where first_name= v_first;
END;

---->
命令的第 19 行開始發生錯誤 -
declare v_first varchar2(10);
BEGIN
  v_first :='AA';
  select * from student where first_name= v_first;
END;
錯誤報告 -
ORA-06550: 第 4 行, 第 3 個欄位:
PLS-00428: 在此 SELECT 敘述句中預期會出現一個 INTO 子句
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
作者: jackson198574    时间: 2014-09-01 22:26
回复 1# hartball38


    在begin和end之间只有简单的select是不行的,需要有select into 变量或者是增删改操作。
作者: hartball38    时间: 2014-09-02 09:11
您好:
謝謝,
我有找到, 我要先設一個 XX%Rowtype 類型 來給 select   *  into  XX ...
且這一個 RowType 也只能接收 一筆Row的資料,沒辦法接收 多筆ROW的資料

??
作者: hartball38    时间: 2014-09-03 11:25
回复 2# jackson198574

您好:
想再延續該問題,請教BEGIN中用到暫存表格 與  SESSION 的問題

Q1.BEGIN  END 中,用select ,必須用 into 來承接資料,若次select 出多筆,則似乎要用暫存表來接?
沒有其他辦法嗎?

Q2.若要用到暫存表,又有分SESSION 與TRAINSATION
請問SESSION 是指 開啟一個 SQL PLUS ,算一個SESSION
還是  只要用同一個帳號登入,就算一個SESSION

因為,
SQL_PLUS 01:
CREATE GLOBAL TEMPORARY TABLE emp_tmp
         ON COMMIT DELETE ROWS
as select * from emp;

insert into emp_tmp
select * from emp where empid = 00101;

--尚未COMMIT;
select * from emp_tmp;  --->有資料

SQL_PLUS 02: 同USER
select * from emp_tmp;  --->沒有資料  


且,就算我把SQL PLUS 全部關掉,再重開一個SQL PLUS03,同帳號登入
這時,該EMP_TMP的結構仍會存在..

SQL DEVELOPER 開啟一個工作表,算一個SESSION 嗎?感覺好像不是...

Q2-1請問結構不會自動刪除嗎?
MSSQL 使用 @ 或 @@暫存表,關掉SSMS 該TABLE 就會消失。


Q3.若用 PRESERVE ROWS
CREATE GLOBAL TEMPORARY TABLE emp_tmp
         ON COMMIT PRESERVE ROWS
as select * from emp

他會把順便所有emp資料一起寫入,並不像   PRESERVE 那樣 只建架構?
這樣正確嗎?

Q4.若是在BEGIN ~END中 要撈取多筆資料,一般要如何做?

謝謝!

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2