PLSQL入门与精通(第5章:SELECT INTO)

大家好,我是从事软件行业20年的牧无文兄。

今天针对PLSQL的SELECT进行说明。

请注意单独使用SELECT语句和PL/SQL中使用SELECT语句时的区别。

首先,有一个单独的SELECT语句可以做到以下几点:
SQL> SELECT SAL FROM EMP WHERE EMPNO = 10001;

SAL

1300

从员工表(EMP表)中,员工编号(EMPNO)询问了10001的员工工资(SAL)。

那么,用PL/SQL块试着执行这个SELECT语句吧。

要做成PL/SQL块,如果不需要变量宣言等,直接用BEGIN和END圈起来的话就会发生错误:

▼▼▼▼从这里▼▼▼▼
SQL> BEGIN
2 SELECT SAL FROM EMP WHERE EMPNO = 10001;
3 END;
4 /

SELECT SAL FROM EMP WHERE EMPNO = 10001;

行2发生错误。:
ORA-0650:行2、列3:
PLS-00428:INTO句进入这个SELECT句。
▲▲▲▲▲▲▲▲至此

该好好执行的SELECT语句在PL/SQL块中为什么会出错呢?

那是因为在PL/SQL块内,如果使用SELECT语句,需要将询问的结果代入变量这样的记述。
一般来说,不仅是PL/SQL,程序内SELECT语句的作用是将数据库查询的结果代入变量。

只有代入变量后,才能在程序内保持该值,然后将该值传递给执行语句。

那么,PL/SQL的情况下,用SELECT询问的结果代入变量的记述是怎样的呢?
那个根据SELECT语句的返回行数,分成两个模式。返回一行和返回多行的两种模式。

这次介绍只返回一行的SELECT文。

仅返回1行结果的SELECT语句的PL/SQL块中的记述为以下语法:。
SELECT列1,列2,…INTO变量1,变量2
FROM~(略)

简而言之,就是在SELECT句之后设置INTO句,将SELECT句指定的列的值按顺序代入INTO句的变量的结构。
因此,SELECT语句指定的列数和INTO语句指定的变量数必须相同。当然,此变量必须在声明部分中声明。

我们暂时称之为SELECT INTO文。

那么,我们马上用SELECT INTO文进行试样一下。

为此,虽然需要变量声明,但请试着声明保存EMP表中SAL列值的V_SAL变量。数据类型是数值,所以是NUMBER型。

如上次说明的,声明如下:

<变量定义域>
V_SALL NUMBER;

或者,与EMP表中的SAL列相同的数据类型,以下宣言也可以:

<变量定义域>
V_SALL EMP.SAL%TYPE;

中记述PL/SQL块整体,发送给服务器,执行的如下所示。

▼▼▼▼从这里▼▼▼▼
SQL> DECLARE
2 V_SAL EMP.SAL%TYPE;
3 BEGIN
4 SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = 10001;
5 END;
6 /

PL/SQL过程成功完成。
▲▲▲▲▲▲▲▲至此

这次不会出错吧。

变量定义域从开头的DECLARE开始,定义V_SAL变量。
从第3行的BEGIN开始执行部,将咨询的SAL列的值代入V_SAL变量。

这样确实不会出错,但是作为程序来说是没有意义的处理。

好不容易将数值代入变量,之后却没有执行语句:不使用变量的值。

在块的执行结束的阶段,PL/SQL块内的变量会消失,所以是无意义的处理。
因此,如果不使用该变量的值进行处理,就不像程序。用那个变量来处理吧。

例如,DBMSOUTPUT.PUT_LINE输出到画面。

DBMS OUTPUT仅在SQL*Plus画面上,可以显示从服务器返回的信息。

▼▼▼▼从这里▼▼▼▼
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 V_SAL_EMP.SAL%TYPE;
3 V_ENAME EMP.ENAME%TYPE;
4 BEGIN
5 SELECT SAL, ENAME INTO V_SAL, V_ENAME FROM EMP WHERE EMPNO = 7934;
6 DBMS_OUTPUT.PUT_LINE(V_ENAME||‘的工资是||V_SAL||’);
7 END;
8 /

MILLER的工资是1200

PL/SQL过程成功完成。

▲▲▲▲▲▲▲▲至此

这次怎么样?有点像程序了呢。

在第二行中,除了SAL列变量之外,还声明ENAME列变量V_ENAME。

在第5行的SELECT INTO语句中,将SAL列和ENAME列的值代入各自的变量中。
在第6行中将这些变量合并成字符串,并将DBMS-OUTPUT.PUT_LINE将其保存到服务器的信件缓冲区。
随着块的结束,该消息返回客户机,并通过SQL*Plus的功能在画面上显示。

在这样的程序中,SELECT语句的作用不是显示询问的数据,而是代入变量。

那么,今天我们就从1行结果的SELECT语句中,来解释将结果代入变量的方法。

下次也继续说明SELECT关系。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/113918049