oracle sql学习报错记录

报错一

代码:

INSERT INTO customers
VALUES (1, 'Babara', 'MacCaffrey', TO_DATE('1986-03-28', 'YYYY-MM-DD'), '781-932-9754', '0 Sage Terrace', 'Waltham', 'MA', 2273);

报错信息:

[42000][1950] ORA-01950: 对表空间 'USERS' 无权限 Position: 12

原因:

对于一个新建的用户,如果没有分配给unlimited table space系统权限的用户,必须先给他们指定限额,才能在表空间中创建对象。

解决方法:

SQL>ALTER USER 用户名 QUOTA UNLIMITED ON "USERS";

报错二

代码:

创建表时,其中一条语句编译报错

CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers (customer_id) ON update CASCADE

报错信息:

DELETE expected, got 'update'

原因:

Oracle本身只支持外键的级联删除,并不支持外键的级联更新。

解决方法:

我们可以通过触发器来实现外键的级联更新。如下:

create or replace trigger trg_orders_customer_idafter updateon customersfor each row
beginif :NEW.customer_id <> :old.customer_id thenupdate orders set customer_id=:new.customer_id where customer_id = :old.customer_id;end if;
end;

报错三

代码:

创建表时,其中一条语句编译报错

CONSTRAINT fk_client_id FOREIGN KEY (client_id) REFERENCES clients (client_id) ON DELETE RESTRICT

报错信息:

CASCADE or SET expected, got 'RESTRICT'

原因:

Oracle不支持使用这种方法来指定外键约束的删除行为。

解决方法:

我们可以通过触发器来实现。如下:

create or replace trigger trg_clients_invoices_idbefore deleteon clientsfor each row
declare--变量声明,用于在触发器中存储查询结果的计数值client_id_count NUMBER;
beginselect count(*)INTO client_id_countFROM invoicesWHERE client_id = :old.client_id;if client_id_count > 0 thenraise_application_error(-20001, 'Cannot delete order. Related order items exist.');end if;
end;

报错四

代码:

insert into CUSTOMERS (FIRST_NAME, LAST_NAME,BIRTH_DATE, ADDRESS, CITY, STATE)
values ('John','Smith',to_date('1990-01-01', 'YYYY-MM-DD'),'address','city','CA');

报错信息:

[2023-12-13 23:05:00] [23000][1] ORA-00001: 违反唯一约束条件 (ORCL.PK_CUSTOMERS)
[2023-12-13 23:05:00] Position: 0

原因:

主键自增触发器所使用的序列从1开始。如下:

create sequence SEQ_CUSTOMERSminvalue 1nomaxvaluestart with 1nocyclecache 10;

创建表时,插入的初始数据没有通过触发器生成主键,因此序列还是从1开始。
插入的初始数据时使用代码如下:

INSERT INTO customers
VALUES (10, 'Levy', 'Mynett', TO_DATE('1969-10-13', 'YYYY-MM-DD'), '404-246-3370', '68 Lawn Avenue', 'Atlanta', 'GA', 796);

解决方法:

将序列删除,改成从11开始。如下:

drop sequence SEQ_CUSTOMERS;create sequence SEQ_CUSTOMERSminvalue 1nomaxvaluestart with 11nocyclecache 10;

报错五

代码:

insert allinto SHIPPERS (NAME)values ('shipper1')into SHIPPERS (NAME)values ('shipper2')into SHIPPERS (NAME)values ('shipper2')select 1from DUAL

报错信息:

[2023-12-14 21:51:07] [23000][1] ORA-00001: 违反唯一约束条件 (ORCL.PK_SHIPPERS)
[2023-12-14 21:51:07] Position: 0

原因:

该代码只会触发一次主键自增触发器,因此当多条数据插入时,会使用同一个被生成的主键。

解决方法:

一、通过联合(union)的方式批量插入,如下:

INSERT INTO shippers (name)
SELECT 'SHIPPER_1'
FROM dual
UNION
SELECT 'SHIPPER_2'
FROM dual
UNION
SELECT 'SHIPPER_3'
FROM dual;

二、插入时,声明主键,如下:

insert all
into SHIPPERS (shipper_id, NAME)
values (SHIPPERS_SEQ.nextval, 'shipper1')
into SHIPPERS (shipper_id,NAME)
values (SHIPPERS_SEQ.nextval+1,'shipper2')
into SHIPPERS (shipper_id,NAME)
values (SHIPPERS_SEQ.nextval+2,'shipper3')
select 1
from DUAL;

报错六

代码:

多表插入,插入ORDERS表后,获取自动生成的ORDER_ID值并插入ORDER_ITEMS表中。

begininsert into ORDERS (ORDER_ID, customer_id, order_date, status)values (SEQ_ORDERS.nextval, 1, to_date('1990-01-02', 'YYYY-MM-DD'), 1);insert into ORDER_ITEMSSELECT SEQ_ORDERS.currval, 1, 1, 2.95from DUALunionSELECT SEQ_ORDERS.currval, 2, 1, 3.95from DUAL;
end;

报错信息:

[2023-12-15 11:03:55] [65000][6550]
[2023-12-15 11:03:55] 	ORA-06550: 第 6,23 列:
[2023-12-15 11:03:55] 	PL/SQL: ORA-02287: 此处不允许序号
[2023-12-15 11:03:55] 	ORA-06550: 第 5,5 列:
[2023-12-15 11:03:55] 	PL/SQL: SQL Statement ignored
[2023-12-15 11:03:55] Position: 205

原因:

currval只能在SELECT语句中使用,并且必须在序列的NEXTVAL之后才能使用。在SELECT子句中直接使用SEQ_ORDERS.currval,这是不允许的。

解决方法:

将SEQ_ORDERS.currval的值存储在一个变量中,然后在SELECT子句中使用该变量。

DECLAREnew_order_id NUMBER;
begininsert into ORDERS (ORDER_ID, customer_id, order_date, status)values (SEQ_ORDERS.nextval, 1, to_date('1990-01-02', 'YYYY-MM-DD'), 1);SELECT SEQ_ORDERS.currval INTO new_order_id FROM DUAL;insert into ORDER_ITEMSSELECT new_order_id, 1, 1, 2.95from DUALunionSELECT new_order_id, 2, 1, 3.95from DUAL;
end;

报错七

代码:

select c.CUSTOMER_ID, c.FIRST_NAME, c.LAST_NAMEfrom CUSTOMERS cjoin ORDERS o using (customer_id)join ORDER_ITEMS oi using (order_id)where STATE = 'VA'

报错信息:

[2023-12-15 21:22:39] [99999][25154] ORA-25154: USING 子句的列部分不能有限定词
[2023-12-15 21:22:39] Position: 7

原因:

在Oracle中,USING子句用于指定两个表之间的列进行自动连接,但它不允许在列名中使用表限定词。

解决方法:

一、去掉表限定词,如下:

select CUSTOMER_ID, FIRST_NAME, LAST_NAME
from CUSTOMERS c
join ORDERS o using (customer_id)
join ORDER_ITEMS oi using (order_id)
where STATE = 'VA';

二、改为使用ON子句来指定连接条件,如下:

SELECT c.CUSTOMER_ID, c.FIRST_NAME, c.LAST_NAME
FROM CUSTOMERS c
JOIN ORDERS o ON c.customer_id= o.customer_id
JOIN ORDER_ITEMS oi ON o.order_id = oi.order_id
WHERE STATE = 'VA';

报错八

代码:

select INVOICE_ID,INVOICE_TOTAL,(select avg(INVOICE_TOTAL) from INVOICES) as invoice_average,INVOICE_TOTAL - (select invoice_average)
from INVOICES

报错信息:

[2023-12-20 11:24:22] [42000][923] ORA-00923: 未找到要求的 FROM 关键字
[2023-12-20 11:24:22] Position: 159

原因:

Oracle中,在子查询中引用外部查询结果时,不能直接使用子查询的别名。

解决方法:

一、子查询嵌套到外部查询

SELECT INVOICE_ID,INVOICE_TOTAL,(SELECT AVG(INVOICE_TOTAL) FROM INVOICES) AS invoice_average,INVOICE_TOTAL - (SELECT AVG(INVOICE_TOTAL) FROM INVOICES) AS difference
FROM INVOICES;

如果想避免重复执行同一个子查询可以通过内联视图
二、内联视图

select t.INVOICE_ID,t.INVOICE_TOTAL,invoice_average,t.INVOICE_TOTAL - invoice_average as difference
from INVOICES t, (select avg(INVOICE_TOTAL) as invoice_average from INVOICES);

注:内联视图只能用无相关子查询

报错九

代码:

select concat(FIRST_NAME, ' ', FIRST_NAME) as full_name
from CUSTOMERS

报错信息:

[2023-12-21 10:15:10] [42000][909] ORA-00909: 参数个数无效
[2023-12-21 10:15:10] Position: 7

原因:

concat()函数默认只接受两个参数。

解决方法:

嵌套使用concat()函数

select concat(concat(FIRST_NAME, ' '), LAST_NAME) as full_name
from CUSTOMERS;

报错十

代码:

create view sales_by_client as
select c.CLIENT_ID,c.NAME,sum(INVOICE_TOTAL) as total_sales
from CLIENTS cjoin INVOICES i on c.CLIENT_ID = i.CLIENT_ID
group by c.CLIENT_ID, c.NAME;      

报错信息:

[2023-12-24 15:07:35] [42000][1031] ORA-01031: 权限不足
[2023-12-24 15:07:35] Position: 12

原因:

没有创建视图权限。

解决方法:

使用管理员账户登录到 Oracle 数据库,然后执行以下语句:

SQL> GRANT CREATE VIEW TO your_user;

报错十一

代码:

create or replace procedure get_clients_by_state_default(p_state in varchar2)isclient_record CLIENTS%rowtype;
beginif p_state is null thenp_state := 'CA';end if;select * into client_record from CLIENTS c where c.STATE = p_state;DBMS_OUTPUT.PUT_LINE(client_record.CLIENT_ID || ' ' || client_record.NAME);
end;

报错信息:

[2023-12-26 13:30:20] [99999][17110] Warning: 执行完毕, 但带有警告
[2023-12-26 13:30:20] completed in 1 s 882 ms
[2023-12-26 13:30:20] 6:9:PLS-00363: 表达式 'P_STATE' 不能用作赋值目标
[2023-12-26 13:30:20] 6:9:PL/SQL: Statement ignored

原因:

在 Oracle 中,存储过程的参数是只读的,不能直接对其进行赋值操作。

解决方法:

可以使用一个新的变量来接收默认值,并在存储过程中使用该变量进行查询。

create or replace procedure get_clients_by_state_default(p_state in varchar2)isclient_record CLIENTS%rowtype;v_state       VARCHAR2(2); -- 新增变量用于接收默认值
beginif p_state is null thenv_state := 'CA';elsev_state := p_state;end if;select * into client_record from CLIENTS c where c.STATE = v_state;DBMS_OUTPUT.PUT_LINE(client_record.CLIENT_ID || ' ' || client_record.NAME);
end;

报错十二

代码:

设置当前会话的事务隔离级别

alter session set isolation_level = read committed;

报错信息:

[2023-12-30 14:58:40] [72000][1453] ORA-01453: SET TRANSACTION 必须是事务处理的第一个语句
[2023-12-30 14:58:40] Position: 0

原因:

SET TRANSACTION 语句必须在事务开始之前执行。

解决方法:

将之前的事务提交完,就可以执行该语句了。

commit;
alter session set isolation_level = read committed;

报错十三

代码:

查看当前事务隔离级别:

--开启一个事务
select *
from DUAL for update;
--查看当前事务
SELECT s.sid,s.serial#,bitand(t.flag, POWER(2, 28)),case bitand(t.flag, POWER(2, 28))WHEN 0 THEN 'READ COMMITTED'ELSE 'SERIALIZABLE'END AS isolation_level
FROM v$transaction tJOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

报错信息:

[2023-12-30 14:30:05] [42000][942] ORA-00942: 表或视图不存在
[2023-12-30 14:30:05] Position: 212

原因:

没有查询v$transactionv$session的权限。

解决方法:

GRANT SELECT ON V_$TRANSACTION TO your_user;
GRANT SELECT ON V_$SESSION TO your_user;

报错十四

代码:

create table customers
(customer_id number(11) generated by default as identity,first_name  varchar2(50)         not null,points      number(11) default 0 not null,email       varchar2(255)        not null unique,constraint pk_customers primary key (customer_id)
);

报错信息:

我已经给了用户创建表的权限,却依然报权限不足错误。

[2024-01-06 15:30:32] [42000][1031] ORA-01031: 权限不足
[2024-01-06 15:30:32] Position: 0

原因:

generated by default as identity:该代码的作用是,插入时自动递增。在Oracle中是通过序列和触发器实现的,因此不仅要给用户创建表的权限还要给创建序列和触发器的权限

解决方法:

grant create trigger to username;
grant create sequence to username;

未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I.MX6ULL_Linux_驱动篇(52)linux CAN驱动

CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领域发展的热点技术之一&#xff0c;由于其高可靠性&#xff0c; CAN 总线…

【性能测试】JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

< Linux >缓冲区

在上一篇文件的重定向&#xff0c;通常会涉及文件描述符的操控。文件描述符1&#xff08;fd 1&#xff09;通常代表着标准输出&#xff08;stdout&#xff09;&#xff0c;它默认是指向用户的终端或控制台。当执行文件重定向操作时&#xff0c;如果我们关闭文件描述符1&#xf…

AUTOSAR Builder—符合AUTOSAR(CPAP)的嵌入式系统设计工具

产品概述 AUTOSAR Builder是达索旗下一款基于Eclipse并使用Artop的可扩展工具套件。Artop是由AUTOSAR成员和合作伙伴共同推动的开放的AUTOSAR工具环境。它使用户能够构建自己的工具并与其他工具供应商进行集成。AUTOSAR Builder在此基础上新增了多个工具套件&#xff0c;更加能…

华为HarmonyOS 创建第一个鸿蒙应用 运行Hello World

使用DevEco Studio创建第一个项目 Hello World 1.创建项目 创建第一个项目&#xff0c;命名为HelloWorld&#xff0c;点击Finish 选择Empty Ability模板&#xff0c;点击Next Hello World 项目已经成功创建&#xff0c;接来下看看效果 2.预览 Hello World 点击右侧的预…

go语言多线程操作

目录 引言 一、如何实现多线程 1. 线程的创建与管理: 2. 共享资源与同步: 3. 线程间通信: 4. 线程的生命周期管理: 5. 线程安全: 6. 考虑并发问题: 7. 性能与资源利用: 8. 特定语言或框架的工具和库: 二、go语言多线程 Goroutine 1. 轻量级: 2. 动态栈: 3. 调度:…

INT201 形式语言与自动机笔记(下)

L6 Context-Free Languages 上下文无关语言 Context-Free Grammar (CFG) 是一组用于生成字符串模式的递归规则。上下文无关的语法可以描述所有的常规语言&#xff0c;但它们不能描述所有可能的语言。 e.g 遵循这些规则&#xff0c;我们可以生成一种语言: 上下文无关文法 Co…

热钱涌向线控底盘!XYZ全栈集成引领新风向

在车身、底盘部分&#xff0c;中央计算区域控制带动传统车控、底盘及动力控制ECU市场迎来新一轮技术升级和域融合窗口期。线控制动、转向及空气悬架&#xff0c;正在加速与智能驾驶融合并进一步提升驾乘体验。 12月13-15日&#xff0c;2023&#xff08;第七届&#xff09;高工…

树莓派3B+ /+ CSI摄像头 + FFmpeg + SRS 实现直播推流

简介&#xff1a; 手头有一个树莓派3B 和一块CSI摄像头&#xff0c;想要实现一个推拉流直播的效果。 所需材料&#xff1a;开发板&#xff08;我用的是树莓派3B&#xff09;、CIS摄像头、云服务器&#xff08;用来搭建SRS服务器&#xff09; 具体实现思路&#xff1a; 使用…

【MySQL】ALL函数的巧用 以及 排序(order by)巧用 sum(条件表达式) 语法

力扣题 1、题目地址 578. 查询回答率最高的问题 2、模拟表 SurveyLog 表&#xff1a; Column NameTypeidintactionENUMquestion_idintanswer_idintq_numinttimestampint 这张表可能包含重复项。action 是一个 ENUM(category) 数据&#xff0c;可以是 “show”、“answer”…

[排序算法] 如何解决快速排序特殊情况效率低的问题------三路划分

前言 在[C/C]排序算法 快速排序 (递归与非递归)一文中,对于快速排序的单趟排序一共讲了三种方法: hoare、挖坑法、双指针法 ,这三种方法实现的快速排序虽然在一般情况下效率很高,但是如果待排序数据存在大量重复数据,那这几种方法的效率就很低,而为了解决快速排序在这样特殊情况…

XCode Build报错

XCode Build时报以下错误 B/BL out of range 143266484 (max /-128MB) 错误提示表明生成的机器代码太大&#xff0c;超出了限制 需要在XCode工程中添加宏定义&#xff0c;使得生成的可执行文件超过限制 步骤&#xff1a; 在项目设置页面中&#xff0c;选择 “Build Settings…

labelme的安装

首先尝试在(openmmlab)的python3.8的环境下安装&#xff08;失败&#xff09;。应该是我环境其他部分不对&#xff0c;和python版本应该没什么关系。&#xff08;后续&#xff0c;创建新的环境后成功&#xff0c;可直接看最后一部分。&#xff09; 首先安装是没问题的 pip in…

web学习笔记(十二)

目录 1.运算符 1.1算术运算符 1.2比较运算符&#xff08;关系运算符&#xff09; 1.3赋值运算符 1.4逻辑运算符 1.5条件运算符 1.6运算符的优先级 1.7补充 2.流程控制 2.1顺序结构&#xff1a; 2.2分支结构&#xff1a; &#xff08;1&#xff09;单分支&#xff08…

浅谈智能照明系统调试阶段节能方案的探究与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】针对当今智能照明系统调试完成前能源浪费的问题&#xff0c;本文结合工程案例&#xff0c;分析研究了智能照明系统调试阶段的节能方法&#xff0c;提出了采用时间控制器来解决能源及人工浪费等问题的方式。实践证明&a…

深度学习-模型转换_所需算力相关

模型转换相关 tensflow转onnx python -m tf2onnx.convert \--graphdef /root/autodl-tmp/warren/text-detection-ctpn/data/ctpn.pb \--output ./model.onnx --inputs Placeholder:0 --outputs Reshape_2:0&#xff0c;rpn_bbox_pred/Reshape_1:0 pytorch转onnx #!/usr/…

SMTP发送邮件命令行怎么操作?

在现代信息社会中&#xff0c;电子邮件已经成为人们沟通、工作和交流的重要工具。SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;作为电子邮件传输的标准之一&#xff0c;通过命令行操作可以更为灵活地进行邮件的发送。本文将介绍如何使用命令行进行SMTP邮件发送&…

基于spark的个性化招聘推荐系统

介绍 本就业推荐系统是一个基于Spark框架的个性化推荐平台&#xff0c;使用Python Django框架、Vue和Element-Plus UI组件库构建而成。该系统通过Scrapy爬虫框架抓取招聘网站的职位数据&#xff0c;用户可以根据关键词查询符合条件的职位信息&#xff0c;同时还提供了基于协同…

ps导出图像自动修改dpi问题的处理

问题 今天修改一个图片&#xff0c;一切都准备就绪后&#xff0c;只要一导出图片&#xff0c;像素不变&#xff0c;但dpi立刻就变成了96dpi&#xff0c;无论怎么修改就是这个值&#xff0c;但我的原值是300dpi&#xff0c;差的不是一点半点。最后在网友的帮助下解决&#xff0…

和vue2对比的Vue3新写法,在vue2基础上快速上手vue3项目

本文的目的&#xff0c;是为了让已经有 Vue2 开发经验的 人 &#xff0c;快速掌握 Vue3 的写法。 一、Vue3 里 script 的三种写法 首先&#xff0c;Vue3 新增了一个叫做组合式 api 的东西&#xff0c;英文名叫 Composition API。因此 Vue3 的 script 现在支持三种写法&#x…