oracle中select缺少into?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中select缺少into?相关的知识,希望对你有一定的参考价值。

CREATE OR REPLACE PROCEDURE mould_get (
v_number IN VARCHAR2 DEFAULT NULL,
v_type IN VARCHAR2 DEFAULT NULL,
v_description IN VARCHAR2 DEFAULT NULL,
v_repair IN NUMBER DEFAULT NULL,

)
as
begin
select * from mouldmanager;

end ;

只是做个oracle程序集返回。出来这么个错误,烦请大侠帮忙。

PL/SQL语句块里,单独的select语句必须和into语句成对出现。

语法如此
返回结果集 需要用到游标。单独的过程不能是一个查询语句。
即使这样 也报错的 begin select * from tablea ; end;
这样:
as
cursor c_cur is select * from tablea;
begin
open c_cur;
end ;
参考技术A

如果你是要   Oracle 返回结果集的情况, 恐怕要使用函数来处理了。


你可以参考一下下面的例子:


-- 测试表数据。
select * from test_main;

        ID VALUE
---------- --------------------
         1 ONE
         3 THREE
         2 TWO



-- 返回结果集的函数.
CREATE OR REPLACE FUNCTION Get_Test_Main_All
RETURN SYS_REFCURSOR
IS
  return_cursor SYS_REFCURSOR;
BEGIN
  OPEN return_cursor FOR 'SELECT * FROM test_main';
  RETURN return_cursor;
END;
/



-- 普通的查询,来查看结果.
SELECT Get_Test_Main_All() FROM dual;

GET_TEST_MAIN_ALL()
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

        ID VALUE
---------- --------------------
         1 ONE
         3 THREE
         2 TWO


-- 存储过程调用, 来获取结果.
DECLARE 
  -- 调用函数的返回值.
  testCursor SYS_REFCURSOR;
  -- 存储单行数据.
  testRec  test_main%ROWTYPE;
BEGIN
  -- 调用返回结果集的函数.
  testCursor := Get_Test_Main_All();
  -- 循环,遍历结果.
  LOOP
    -- 游标向前.
    FETCH testCursor INTO testRec;
    -- 无数据的情况下,退出循环.
EXIT WHEN testCursor%NOTFOUND;
    -- 输出调试信息.
    dbms_output.put_line( TO_CHAR(testRec.id) || ' ' || testRec.value);
  END LOOP;
END;
/

1 ONE
3 THREE
2 TWO

PL/SQL 过程已成功完成。

参考技术B 返回结果集 需要用到游标。单独的过程不能是一个查询语句。
即使这样 也报错的 begin select * from tablea ; end;
这样:
as
cursor c_cur is select * from tablea;
begin
open c_cur;
end ;追问

那请问,一下,我调用的时候,应该怎么写方法你?
谢谢你的,帮助,我就想再咨询你一下。

追答

begin

procedure_name(args);
end;

本回答被提问者和网友采纳
参考技术C select语句的语法是没有into的。
sql:select * from tablename where 条件。
解释:以上语句就是select的用法,是没有into关键字的。
扩展一:insert 语句是有into的。
sql: insert intotablename(id) values(12);
扩展二:存储过程中有into语句,表示赋值。
sql:select name into 变量 from tablename ;

Oracle中insert into select和select into的区别

insert into select可以将select 出来的N行(0到任意数)结果集复制一个新表中,select into
from只能将"一行"结果复制到一个变量中。这样说吧,select into是PL/SQL language
的赋值语句。而前者是标准的SQL语句。

做一个测试看两者差别。

首先创建两个表,一个作为源表,一个作为目标表。

create table t_source(
id number primary key,
testname varchar2(20),
createtime date,
flag varchar2(10)
);

create table t_target(
id number primary key,
testname varchar2(20),
createtime date,
flag varchar2(10)
);

接着,插入测试数据

insert into t_source values(1,\'测试数据1....1\',sysdate-2,\'N\');
insert into t_source values(2,\'测试数据1....2\',sysdate-2,\'N\');
insert into t_source values(3,\'测试数据1....3\',sysdate-2,\'N\');
commit;

测试insert into select 操作

insert into test2 select * from t_source where id=1;
commit;

测试select into 操作
因为select into是一个plsql语言中的复制语句,和:=实现的目标一样。

create or replace procedure sp_sync_test is
aa varchar2(100);
v_record t_source%rowtype;
begin
select t1.testname into aa from t_source t1 where id = 1;
dbms_output.put_line(\'普通变量 t1.testname= \' || aa);

select t1.* into v_record from t_source t1 where id = 1;
dbms_output.put_line(\'记录变量 t1.testname= \' || v_record.testname);

end;

这里增加了原始类型的变量和记录类型的变量
参考技术A Oracle中insert into select和select into的区别:
select into 就相当于赋值语句,insert into是复制语句。
在Oracle中,将一张表的数据复制到另外一个对象中。通常会有这两种方法:insert into select 和 select into from。
下面这个例子可以直观显示出二者的区别:
select * into target_table from source_table;
insert into target_table(column1,column2) select column1,5 from source_table;
以上两句都是将源表source_table的记录插入到目标表target_table,但两句又有区别。
第一句(select into from)要求目标表target_table不存在,因为在插入时会自动创建。
第二句(insert into select from)要求目标表target_table存在,由于目标表已经存在,
所以我们除了插入源表source_table的字段外,还可以插入常量,
把一张旧表里的字段复制到另外一张新表中.可以这样写sql语句
select * into 新表 from 旧表 where 新表.id=旧表.id
参考技术B 1.INSERT INTO SELECT语句
语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
或者:Insert into Table2 select * from Table1
注意:(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:
+ expand sourceview plaincopy to clipboardprint

--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10)
)
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int
)

--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)

select * from Table2

--3.INSERT INTO SELECT语句复制表数据部分列和常值

Insert into Table2(a, c, d) select a,c,5 from Table1
或:Insert into Table2 select * from Table1
--4.显示更新后的结果

select * from Table2

--5.删除测试表
drop TABLE Table1
drop TABLE Table2

2.SELECT INTO FROM语句
语句形式为:SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:
view plaincopy to clipboardprint?
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10)
)

--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)

--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1

--4.显示更新后的结果
select * from Table2

--5.删除测试表
drop TABLE Table1
drop TABLE Table2
参考技术C insert into 表名1 select 表名2:表示从表2查询数据赛到表1中
select 字段1 into 字段2 from 表名1:表示从表1中查询字段1插到临时变量字段2中
参考技术D insert into select
是SQL文,直接在sqlplus里就可以执行。

select into
是PL/SQL中的语法,需要放在PL/SQL的逻辑块中才能被识别执行。

以上是关于oracle中select缺少into?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:使用带有递归 CTE 的 SELECT INTO 时出现“缺少关键字”

PL/SQL SELECT INTO 错误 (ORA-00905)

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

oracle存储过程select语句必须带into吗