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程序集返回。出来这么个错误,烦请大侠帮忙。
语法如此
返回结果集 需要用到游标。单独的过程不能是一个查询语句。
即使这样 也报错的 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;
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 intofrom只能将"一行"结果复制到一个变量中。这样说吧,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的区别