如果我有这样的表格:
pkey age
---- ---
1 8
2 5
3 12
4 12
5 22
Run Code Online (Sandbox Code Playgroud)
我可以"分组"来计算每个年龄.
select age,count(*) n from tbl group by age;
age n
--- -
5 1
8 1
12 2
22 1
Run Code Online (Sandbox Code Playgroud)
我可以使用什么查询按年龄范围分组?
age n
----- -
1-10 2
11-20 2
20+ 1
Run Code Online (Sandbox Code Playgroud)
我在10gR2上,但我也对任何11g特定的方法感兴趣.
我正在尝试将一组(varchar)数据传递给Oracle过程.Oracle过程可以从SQL*Plus调用,也可以从另一个PL/SQL过程调用,如下所示:
BEGIN
pr_perform_task('1','2','3','4');
END;
Run Code Online (Sandbox Code Playgroud)
pr_perform_task 将读取每个输入参数并执行任务.
我不确定如何实现这一目标.我的第一个想法是使用类型的输入参数varray但我得到Error: PLS-00201: identifier 'VARRAY' must be declared错误,当程序定义如下所示:
CREATE OR REPLACE PROCEDURE PR_DELETE_RECORD_VARRAY(P_ID VARRAY) IS
总而言之,如何将数据作为数组传递,让SP循环遍历每个参数并执行任务?
我正在使用Oracle 10gR2作为我的数据库.
我尝试了以下代码的不同方式,比如取出while或if,但是当我把它们放在一起时(if和while),我总是得到错误...
undefine numero
set serveroutput on
accept numero prompt 'Type # between 100 and 999: '
declare
i number:=1;
a char(25);
b char(1);
c varchar2(10);
d number;
begin
c := №
d := length(c);
b := substr(c, i, 1);
while i <= d loop
if b = '1' then
a:= a||'one ';
end if;
i := i+1;
end loop;
dbms_output.put_line('The number is '||a);
end;
/
Run Code Online (Sandbox Code Playgroud)
错误:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line …Run Code Online (Sandbox Code Playgroud) 我在Oracle 10g上.在一个要求中,我需要增加pl/sql varchar2变量的大小.它已经达到4000尺寸.我已经读过"在PL/SQL中,VARCHAR2可以达到32767字节.对于SQL,限制是4000字节"
我可以在不担心SQL限制的情况下增加此变量的大小吗?
有没有办法让你可以在sqlplus中将SERVEROUTPUT设置为ON,但以某种方式抑制在完成执行plsql过程后自动生成的消息"PL/SQL过程成功完成"?
这是我第一次处理Oracle,我很难理解为什么我收到这个错误.
我在查询的where子句中使用Oracle的ODT.NET w/C#和以下代码:
WHERE table.Variable1 = :VarA
AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%')
AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%')
Run Code Online (Sandbox Code Playgroud)
我正在添加参数值,如下所示:
cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,服务器返回:
ORA-01008: not all variables bound
Run Code Online (Sandbox Code Playgroud)
如果我注释掉'AND(....'行中的任何一行,则查询成功完成.
如果我只查询两个参数,而不是三个参数,为什么查询会正常运行?我收到的错误甚至没有意义
减去timestamps返回值时是interval数据类型.是否有一种优雅的方法可以将此值转换为间隔中的(毫秒/微秒)总数,即整数.
以下可行,但它不是很漂亮:
select abs( extract( second from interval_difference )
+ extract( minute from interval_difference ) * 60
+ extract( hour from interval_difference ) * 60 * 60
+ extract( day from interval_difference ) * 60 * 60 * 24
)
from ( select systimestamp - (systimestamp - 1) as interval_difference
from dual )
Run Code Online (Sandbox Code Playgroud)
SQL或PL/SQL中是否有更优雅的方法?
我正在尝试在条件为TRUE时打印TEXT.选择代码完美正常.当我只运行选择代码时,它显示403值.但是当条件存在时我必须打印一些文本.以下代码有什么问题.
BEGIN
IF EXISTS(
SELECT CE.S_REGNO FROM
COURSEOFFERING CO
JOIN CO_ENROLMENT CE
ON CE.CO_ID = CO.CO_ID
WHERE CE.S_REGNO=403 AND CE.COE_COMPLETIONSTATUS = 'C' AND CO.C_ID = 803
)
THEN
DBMS_OUTPUT.put_line('YES YOU CAN');
END;
Run Code Online (Sandbox Code Playgroud)
这是错误报告:
Error report:
ORA-06550: line 5, column 1:
PLS-00103: Encountered the symbol "JOIN" when expecting one of the following:
) , with group having intersect minus start union where
connect
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Run Code Online (Sandbox Code Playgroud) 这是我经常被问到的一个问题.由于我在stackoverflow上找不到任何完全重复,我想我会把它作为参考发布.
问题:在PL/SQL中,我知道如何捕获异常并在捕获它们时执行代码,以及如何将它们传播到调用块.例如,在以下过程中,直接处理NO_DATA_FOUND异常,而所有其他异常都引发到调用块:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE()
IS
BEGIN
do_stuff();
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Do something
handle_exception();
WHEN OTHERS THEN
-- Propagate exception
RAISE;
END;
Run Code Online (Sandbox Code Playgroud)
但是我应该使用什么命令来忽略一个或所有引发的异常并将执行控制返回给调用块?