免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4443 | 回复: 3
打印 上一主题 下一主题

[求助] 使用DECLARE 當SELECT WHERE 條件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-27 16:56 |只看该作者 |倒序浏览
本帖最后由 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:

论坛徽章:
17
天蝎座
日期:2014-03-10 14:35:04数据库技术版块每日发帖之星
日期:2015-12-13 06:20:00IT运维版块每日发帖之星
日期:2015-12-13 06:20:00数据库技术版块每日发帖之星
日期:2015-10-20 06:20:00数据库技术版块每日发帖之星
日期:2015-08-21 06:20:00数据库技术版块每日发帖之星
日期:2015-06-17 22:20:002015年迎新春徽章
日期:2015-03-04 09:57:092015年辞旧岁徽章
日期:2015-03-03 16:54:15技术图书徽章
日期:2015-01-12 17:05:35亥猪
日期:2014-11-09 13:05:04金牛座
日期:2014-09-25 11:28:54处女座
日期:2014-09-15 19:58:36
2 [报告]
发表于 2014-09-01 22:26 |只看该作者
回复 1# hartball38


    在begin和end之间只有简单的select是不行的,需要有select into 变量或者是增删改操作。

论坛徽章:
0
3 [报告]
发表于 2014-09-02 09:11 |只看该作者
您好:
謝謝,
我有找到, 我要先設一個 XX%Rowtype 類型 來給 select   *  into  XX ...
且這一個 RowType 也只能接收 一筆Row的資料,沒辦法接收 多筆ROW的資料

??

论坛徽章:
0
4 [报告]
发表于 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中 要撈取多筆資料,一般要如何做?

謝謝!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP