我们需要从DATETIME列中获取HOUR(期望返回0到23之间的值).
是否有Oracle等效的SQL Server DATEPART功能?
以下是我的测试功能:
create or replace FUNCTION test
RETURN NUMBER
AS
v_count number(15);
v_msisdn number(15);
BEGIN
v_msisdn:= 225952 * 10000;
-- v_msisdn:=50510060853 * 10000;
return v_msisdn;
END;
Run Code Online (Sandbox Code Playgroud)
当我执行函数时
select test() from dual;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
1426. 00000 - "numeric overflow"
*Cause: Evaluation of an value expression causes an overflow/underflow.
Run Code Online (Sandbox Code Playgroud)
但是,如果我更新
v_msisdn:=50510060853 * 10000;
Run Code Online (Sandbox Code Playgroud)
我没有得到错误.
有人可以解释这个行为,因为第二个查询是一个更大的数字?
这就是表格的样子:
create table IncomeTest (SubjectId int, Date_Value date, debit number, credit number);
insert into IncomeTest values (1, '7-SEP-2017', 11000, 0);
insert into IncomeTest values (1, '7-DEC-2017', 6000, 0);
insert into IncomeTest values (1, '9-JAN-2018', 0, 16110);
insert into IncomeTest values (1, '9-JUL-2018', 0, 619.6);
insert into IncomeTest values (1, '23-JUL-2018', 0, 270.4);
commit;
Run Code Online (Sandbox Code Playgroud)
借方代表现金,贷方代表现金.插入表后,您将获得以下数据:
SubjectID | Date_value | Debit | Credit
1 9/7/2017 11000 0
1 12/7/2017 6000 0
1 1/9/2018 0 16110.0
1 7/9/2018 0 619.6
1 7/23/2018 0 …
Run Code Online (Sandbox Code Playgroud) 我已经定义sqlVariable
并sqlString
在我的语法文件中
syn match sqlVariable ":[a-z][a-z0-9_#$]*"
syn region sqlString start=+'+ end=+'+ contains=sqlVariable
Run Code Online (Sandbox Code Playgroud)
(加上一些其他的引用变体.)字符串可以包含sqlVariable
,以突出动态代码中的绑定,如:b1
in 'select a from b where c = :b1'
.(这适用于Oracle顺便说一句.)
这一切都很好 - 除了包含冒号的日期格式掩码的特定烦人情况,例如
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)
:MI和:SS被突出显示为变量,因为它们当然与我的模式匹配.
有没有办法:MI和:SS sqlVariable
在引用的字符串中不匹配?(我认为只有这两种情况才会这样做.)
我有一个过程,它接收170列的记录作为输入参数(它基于表的结构).
在该过程中,我想调用一个调试过程,其中一个参数是一个包含该记录的所有字段名称和值的文本字符串.
例如:
CREATE OR REPLACE PROCEDURE xxx (pi_record IN table_name%ROWTYPE) as
text VARCHAR2(10000) := NULL;
BEGIN
...
text := 'pi_record.column1 = ' || pi_record.column1 || CHR(13) ||
'pi_record.column2 = ' || pi_record.column2 || CHR(13) ||
...
'pi_record.column170 = ' || pi_record.column170;
logging_procedure (text);
...
END;
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法以动态方式实现这一点(循环记录字段名称和值)而不枚举所有这些?
也许是这样的:
CREATE OR REPLACE PROCEDURE xxx (pi_record IN table_name%ROWTYPE) as
text VARCHAR2(10000) := NULL;
BEGIN
...
LOOP in pi_record.columns
text := text || CHR(13) || pi_record.column.name || ' : ' || pi_record.column.value
END …
Run Code Online (Sandbox Code Playgroud) 我们有一个带有块处理功能的 Spring 批处理应用程序,它作为编写器的一部分从数据库读取记录,处理它们并调用服务/执行一些插入/更新数据库中的一些表。
JDBCPagingItemReader
已被使用,因为当 saveState 为 false 时它是线程安全的。已设置排序键,因此线程不会相互交叉。Oracle 数据源和Spring 批处理的配置也ISOLATION_READ_COMMITTED
使用了隔离级别。JobRepository
ThreadPoolTaskExecutor
目前,在单个实例中使用多线程效果很好。
我们最终应该在 OpenShift 中部署这个 Spring Boot 应用程序,该应用程序将在多个 PODS 中运行,即应用程序的多个实例,它们都从同一个表中读取。
有相关知识的人可以告诉我在多个 Pod(实例)中使用上述组合是否会出现任何问题,或者是否存在必须处理的并发问题。
这种情况下的任何最佳实践都受到高度赞赏。
谢谢你的时间。
我正在尝试过滤掉包含客户互联网计划的列 (plan_name)。例如(200GB 快速无限、免费附加邮箱、无限 VDSL...)。我特别想过滤掉没有任何数字的计划。该列的类型为 varchar2,我正在查询 Oracle 数据库。我编写了以下代码:
SELECT *
FROM plans
WHERE plan_name NOT LIKE '%[0-9]%'
Run Code Online (Sandbox Code Playgroud)
但是,此代码仍会快速返回 200GB 之类的计划,其中包含数字?谁能解释这是为什么?
这个查询:
select nvl(0.75,0) from dual
Run Code Online (Sandbox Code Playgroud)
给我0.75
(数字),但这个查询:
select decode(1,0,null,0.75) from dual
Run Code Online (Sandbox Code Playgroud)
给我'.75'
(字符串).
为什么?
我试图通过将第二个查询更改为:
select decode(1,0,null,to_char(0.75,'0.99')) from dual
Run Code Online (Sandbox Code Playgroud)
但在我的实际代码中,0.75将是一个字段(NUMBER),可能有不同的小数位数,我不想添加/删除该值的任何内容.
有关如何修复缺失零问题但仍支持所有可能的小数长度的任何想法?
有没有办法获取Oracle包中当前正在执行的过程名称?
create or replace package test_pkg
as
procedure proc1;
end test_pkg;
create or replace package body test_pkg
as
procedure proc1
is
-- // Get the Procedure Name here?? //
end proc1;
end test_pkg;
Run Code Online (Sandbox Code Playgroud) 我正在尝试执行左连接,以便从左表中获取所有行,即使这些行的连接条件不成立。
示例:下面的 Aid = Bid 但表 B 只有 3 个 id
我正在使用的查询仅给出连接条件为真的行。即使连接条件不成立,有没有办法从左表中获取所有行?
我的查询:
SELECT Table1.Aid,
Table2.Bid,
Table2.Issueid
FROM Table1
LEFT JOIN Table2 ON Table1.Aid = Table2.Bid;
WHERE Table2.Issueid IN (
'a',
'b'
)
Run Code Online (Sandbox Code Playgroud)