Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询在存储过程之外工作,但在过程内部却会引发错误。

查询在存储过程之外工作,但在过程内部却会引发错误。
EN

Stack Overflow用户
提问于 2018-07-04 05:49:26
回答 1查看 160关注 0票数 1

选择查询完全可以在包过程之外工作,但是在过程中它会抛出'ORA-01858:在需要数字的地方找到一个非数字字符‘错误。

以下是我的疑问:

代码语言:javascript
运行
AI代码解释
复制
DECLARE
      v_general_number VARCHAR(11);
BEGIN
      SELECT 'Q' || TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'Q') || '/'  ||   LPAD(TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL), '3', '0')  || '/' || TO_CHAR(EXTRACT(YEAR FROM TO_DATE(SYSDATE, 'MM/DD/YYYY'))) INTO v_general_number FROM DUAL;
      DBMS_OUTPUT.PUT_LINE(v_general_number);
END;

而且效果很好。

但是在存储过程中,它会抛出上面的错误。

这是我的程序:

代码语言:javascript
运行
AI代码解释
复制
   PROCEDURE save_request(p_name IN requests.suggested_name%TYPE,
                          p_urgency_type IN requests.urgency_type_id%TYPE) 
   AS

      v_general_number VARCHAR(11);

   BEGIN

   SELECT 'Q' || TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'Q') || '/'  ||  LPAD(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL, 3, '0')  ||  '/' ||  TO_CHAR(EXTRACT(YEAR FROM TO_DATE(SYSDATE, 'MM/DD/YYYY')))  INTO v_general_number FROM DUAL;

   INSERT INTO requests (suggested_name,
                          urgency_type_id,
                          general_number 
      ) VALUES (
          p_name ,
          p_urgency_type ,
          v_general_number );



    END save_request;

我看不出是什么问题。如有任何建议,将不胜感激。

更新:

在改变这个问题之后,我解决了这个问题:

代码语言:javascript
运行
AI代码解释
复制
SELECT 'Q' || TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'Q') || '/'  ||  LPAD(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL, 3, '0')  ||  '/' ||  TO_CHAR(EXTRACT(YEAR FROM TO_DATE(SYSDATE, 'MM/DD/YYYY')))   INTO v_general_number FROM DUAL;

对此:

代码语言:javascript
运行
AI代码解释
复制
SELECT 'Q' || TO_CHAR(SYSDATE, 'Q') || '/'  ||  LPAD(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL, 3, '0')  ||  '/' ||  TO_CHAR(EXTRACT(YEAR FROM SYSDATE))  INTO v_general_number FROM DUAL;

而且起作用了。

但是,我仍然不明白为什么相同的查询在过程之外工作,但在过程中抛出错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 06:03:14

SYSDATE已经是个约会了,所以

代码语言:javascript
运行
AI代码解释
复制
TO_DATE(SYSDATE, 'MM/DD/YYYY')

根本没什么意义。您正在执行对字符串的隐式转换,然后将显式转换为日期,即:

代码语言:javascript
运行
AI代码解释
复制
TO_DATE(TO_CHAR(SYSDATE, <NLS_DATE_FORMAT>), 'MM/DD/YYYY')

它是否工作取决于会话的NLS_DATE_FORMAT设置:

代码语言:javascript
运行
AI代码解释
复制
alter session set nls_date_format = 'MM/DD/YYYY';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;

TO_DATE(SY
----------
07/04/2018

select TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'YYYY-MM-DD') from dual;

TO_CHAR(TO
----------
2018-07-04

alter session set nls_date_format = 'DD/MM/YYYY';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;

TO_DATE(SY
----------
07/04/2018

select TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'YYYY-MM-DD') from dual;

TO_CHAR(TO
----------
2018-04-07

alter session set nls_date_format = 'DD-MON-YYYY';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;

ORA-01858: a non-numeric character was found where a numeric was expected

alter session set nls_date_format = 'YYYY-MM-DD';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;

ORA-01843: not a valid month

注意前两个都是“工作”,但实际上给出了不同的日期。(在这个月的晚些时候,在第12号之后,第二个也会失败,一个无效的月份错误。)

运行匿名块的会话和执行过程的会话具有不同的NLS设置。这就是为什么不应该依赖于隐式转换或NLS设置.

无论如何,删除不必要的转换:

代码语言:javascript
运行
AI代码解释
复制
SELECT 'Q' || TO_CHAR(SYSDATE, 'Q')
  || '/' || LPAD(TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL), '3', '0') 
  || '/' || TO_CHAR(EXTRACT(YEAR FROM SYSDATE))
INTO v_general_number
FROM DUAL;

或者做同样的任务,而不是从双重任务中选择:

代码语言:javascript
运行
AI代码解释
复制
v_general_number := 'Q' || TO_CHAR(SYSDATE, 'Q')
  || '/' || LPAD(TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL), '3', '0')
  || '/' || TO_CHAR(EXTRACT(YEAR FROM SYSDATE));

甚至,作为一种选择:

代码语言:javascript
运行
AI代码解释
复制
v_general_number := TO_CHAR(SYSDATE, '"Q"Q"/"')
  || TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL, 'FM000')
  || TO_CHAR(SYSDATE, '"/"YYYY');

它使用日期格式模型中的字符值来复制斜杠的级联,以及序列号的格式模型,这样您就不需要将其填充为零。(您不需要一个变量,您可以在insert的values子句中执行相同的构造。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51175278

复制
相关文章
mybatis 操作存储过程 小细节错误
项目开发的时候遇到一个错误: org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLException: ORA-06550: 第 8 行, 第 4 列: PLS-00103: 出现符号 ";"在需要下列之一时: . ( ) , * @ % & = - + < / > at in is mod remainder not rem => <> or
明明如月学长
2021/08/27
7330
支持多表分页查询的存储过程
本文转载:http://www.cnblogs.com/xiachufeng/archive/2010/07/30/1788592.html
跟着阿笨一起玩NET
2018/09/19
8160
在.NET中调用存储过程
因为做项目要用到数据库,因此存储过程是必不可少的,看了一点如何在.NET中调用存储过程的资料,颇有点心得,觉得这个东西是当用到数据库的时候必须要会的一项技术。下面是它的定义:
SAP梦心
2022/05/07
2.5K0
存储过程
为了保证数据的完整性、一致性,提高应用性能,常采用存储过程技术。 一个存储过程包括名字、参数列表、及许多SQL语句的语句集。
cherishspring
2019/10/14
2.1K0
存储过程
存储过程是用于将代码存储在数据库端,通过存储过程名称就可以调用。存储过程类似于java的方法,但是也是有区别的,方法只能返回一个值,并且需要声明返回值的类型,但是存储过程可以带出多个值,而且不需要声明返回值的类型,而且也可以带值进和带值出。
端碗吹水
2020/09/23
2.2K0
存储过程
存储过程
什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
用户2038009
2021/03/07
2.1K0
存储过程
存储过程 是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理 增强SQL语句的功能和灵活性 实现较快的执行速度 减少网络流量 参数:输入类型 输出类型 输入&&输出 创建存储过程 CREATE [DEFINER = {user|CURRENT_USER}] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic...] routine_body proc_parameter: [IN|OUT|INOUT] param_name_
宇宙之一粟
2020/10/26
1.9K0
存储过程
今日小知识点:(sql 的书写规则) 1、不区分大小写 2、一条语句可以写在一行上也可以多行 3、可用注释增强语句的可读性:单行注释(--)、多行注释(/*...*/)
ellipse
2019/08/16
3.2K0
存储过程
存储过程
## 优点 1. 更好性能  * 存储过是预编译的,在创建时编译;一般SQL是每次执行都会编译 2. 功能实现更加灵活  * 存储过程可以使用条件判断和游标,有很强的灵活性,还可以使用数据库内置函数,完成复杂的判断和运算 3. 减少网络传输  * 复杂的多条SQL操作会消耗大量的网络传输,多条SQL存入存储过程会降低网络负载 4. 安全性  * 存储过程可以屏蔽对底层数据库对象的直接访问  * 执行过程的调用是可见的,无法看到表结构和数据库,不能嵌入SQL,有助于避免SQL注入 缺点
苦咖啡
2018/04/28
1.9K0
MySQL的存储过程_MySQL创建存储过程
在项目开发中,经常会遇到这样一种场景,当修改A表的一条数据时,需要关联修改B表、C表甚至其他更多表的数据,为什么会这样呢?
全栈程序员站长
2022/11/08
23.1K0
MySQL的存储过程_MySQL创建存储过程
SQL Server 存储过程_mysql存储过程教程
**相对于视图的优势(为什么使用存储过程):** Sql Server中视图通过简单的Select查询来解决多次复杂的查询,但是视图不能提供业务逻辑的功能,而存储过程可以。 **什么是存储过程:**
全栈程序员站长
2022/11/14
5.7K0
Mysql存储过程查询结果赋值到变量
一个参数的方法 方式 1 DECLARE cnt INT DEFAULT 0; select count(*) into cnt from test_tbl; select cnt; 方式 2 set @cnt = (select count(*) from test_tbl); select @cnt; 方式 3 select count(*) into @cnt1 from test_tbl; select @cnt1; 多个列的情况下似乎只能用 into 方式 select max(status),
似水的流年
2019/12/05
9.1K0
在Entity Framework中使用存储过程(一):实现存储过程的自动映射
之前给自己放了一个比较长的假期,在这期间基本上没怎么来园子逛。很多朋友的留言也没有一一回复,在这里先向大家道个歉。最近一段时间的工作任务是如何将ADO.NET Entity Framework 4.0(以下简称EF)引入到我们的开发框架,进行相应的封装、扩展,使之成为一个符合在特定场景下进行企业级快速开发的ORM。在此过程中遇到了一些挑战,也有一些心得。为了向大家分享这些心得,也为了借助大家的脑袋解决我们遇到的问题,接下来我会写一系列相关的文章。这些文章的读者适合那些对EF有基本了解的人。 第一个主题是关于
蒋金楠
2018/02/07
2.6K0
mysql存储过程执行_mysql存储过程不执行
查看event是否开启: show variables like ‘%sche%’;
全栈程序员站长
2022/10/02
17.4K0
es写数据的过程,通过id进行查询过程,模糊查询过程
目录 es写数据的过程 es查询数据过程 通过id进行查询过程 模糊查询过程 es写数据的过程 集群有3个 客户端执行写数据的代码的时候,比如kibana里面往索引里面写数据,或者java代码 写数据。客户端会选择一个集群节点发送请求,这个集群节点就是协调节点。这个协调 节点会对写入的数据进行路由,这个路由是有一个算法,经过路由算法,会把请求转发 到对应的集群节点,现在认为转发后的集群节点名字是A,A节点里面的主分片会写入数据 ,并且还会将数据同步到主分片的副本。 如果协调节点发现所有集群的主分片
一写代码就开心
2021/09/29
1.2K0
mysql存储过程
(如果存储过程存在删除后创建!如果不写只能执行一次) 2.DELIMITER //
用户5899361
2020/12/07
9.9K0
PL/SQL --> 存储过程
存储过程子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库。是一个有名字的PL/SQL代码块,支持接收或不接受参数
Leshami
2018/08/07
1.5K0
MySQL 存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
星哥玩云
2022/09/15
37.7K0
MySQL 存储过程
存储过程示例
例1:创建不带参数的存储过程 输出系统日期 create or replace procedure output_date is begin dbms_output.put_line(sysdate); end output_date;
全栈程序员站长
2022/09/06
9320
SQLServer 存储过程
exec sp_renamedb ‘Northwind’,’Northwind1’
授客
2019/09/11
2.5K0

相似问题

SQL查询在存储过程中出现错误1087,但在过程外工作正常

128

SQL Server:存储过程不工作,但在存储过程外部工作

11

事务应该在存储过程之外还是在存储过程内部指定?

60

Server存储过程引发多个错误

12

存储过程在我的子查询上引发错误。

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档