标签: plsql

PL/SQL - 计算重叠时间段之间的不同天数

想象一下这个场景(YYYY/MM/DD):

Start date: 2015/01/01 End date: 2015/08/10 
Start date: 2014/10/03 End date: 2015/07/06 
Start date: 2015/09/30 End date: 2016/04/28
Run Code Online (Sandbox Code Playgroud)

使用 PL/SQL 可以计算这些重叠日期之间的不同天数吗?

编辑:我的表有 2 个 DATE 列,Start_Date 和 End_Date。我期待的结果是 515 天 ((2015/08/10 - 2014/10/03) + (2016/04/28 -2015/09/30))

oracle plsql oracle11g

2
推荐指数
1
解决办法
1350
查看次数

何时在 Oracle 中重新引发相同的异常

我正在阅读 Steven Feuerstein 的 PL/SQL 书。根据它:

当您想从异常处理程序中重新引发(或传播出去)相同的异常时,请使用此表单,如下所示:

EXCEPTION 
 WHEN NO_DATA_FOUND 
 THEN 
 -- Use common package to record all the "context" information,
 -- such as error code, program name, etc. 
 errlog.putline (company_id_in); 
 -- And now propagate NO_DATA_FOUND unhandled to the enclosing block.
 RAISE; 
Run Code Online (Sandbox Code Playgroud)

当您想要记录发生错误的事实,然后将相同的错误传递给封闭块时,此功能很有用。这样,您可以记录应用程序中发生错误的位置,但仍会停止封闭块,而不会丢失错误信息。

我试一试:

create table log_error
    ( 
      error_code number,
      error_name varchar2(400)
    );


 declare
    l_q number := 400;
    l_r number := 0;
    l_result number;
    err_num NUMBER;
    err_msg VARCHAR2(100);
begin
    l_result := l_q/l_r; 
 EXCEPTION
   WHEN OTHERS THEN
  err_num := SQLCODE;
  err_msg …
Run Code Online (Sandbox Code Playgroud)

oracle plsql exception

2
推荐指数
1
解决办法
1160
查看次数

替换最后一次出现的子串

鉴于此字符串:

.ABC、.123、.FGH、.QDG

如何最有效地使用 PL/SQL 进行输出(注意“,和”):

abc、123、fgh 和 qdg

到目前为止,我已经得到了LOWER(REPLACE('.ABC,.123,.FGH,.QDG', '.', ' ')),其收益率

abc, 123, fgh, qdg

如何在“fgh,”之后但在“qdg”(“fgh, and qdg”)之前得到“and”?我必须使用INSTR()and SUBSTR(),还是有一个函数可以用“和”替换最后一个空格?

oracle plsql oracle11g

2
推荐指数
1
解决办法
8684
查看次数

PL/SQL 编译失败时如何让 SQL*Plus 退出

我的脚本文件有以下代码:

WHENEVER SQLERROR EXIT SQL.SQLCODE

@pkg_t.pks
@pkg_t.pkb
Run Code Online (Sandbox Code Playgroud)

我正在从 SQL*Plus 运行该脚本。如果pkg_t.pkb无效,我看到:

Warning: Package created with compilation errors.
Run Code Online (Sandbox Code Playgroud)

但 SQL*Plus 不会退出。我知道pkg_t.pkb有一个 PL/SQL 错误编译,它与 SQL 错误不同。

需要添加什么指令,以便 SQL*Plus 在遇到 PL/SQL 编译错误时退出?

oracle plsql sqlplus

2
推荐指数
1
解决办法
1587
查看次数

在字符串中插入空格 x 个字符 oracle

declare 
  v_nr number DEFAULT 12345678944;    
  v_numberWithSpace varchar2(255);    
  v_count number DEFAULT 1;    
begin    
  for i in 1..length(v_nr)  loop    
    v_numberWithSpace := v_numberWithSpace ||substr(v_nr, v_count, 4)|| ' .';    
    v_count := v_count + 4;
    DBMS_OUTPUT.PUT_LINE( v_numberWithSpace);    
  end loop;      
  v_numberWithSpace := substr(v_numberWithSpace,1 , length(v_numberWithSpace) -1);    
end;
Run Code Online (Sandbox Code Playgroud)

我喜欢 v_numberwithSpace 有以下输出:

1234 5678 944

现在它在字符串的末尾留下空格。我已经放了一个 . 广告代码,使我的意思更清楚。开头和结尾没有空格。我试过这个,但它对我不起作用。

oracle plsql

2
推荐指数
1
解决办法
1348
查看次数

如何使用带有可变表名和条件的立即执行

我想创建一个 PL/SQL 函数,它传递一个表名和一个条件,并返回比条件在该表上满足的行数。

我创建了函数:

CREATE OR REPLACE FUNCTION CHECK_EXISTS 
      (TABLE_NAME VARCHAR2, CONDITION VARCHAR2) RETURN NUMBER AS 
      VAL NUMBER;
      SQL_CODE VARCHAR2(200):='SELECT COUNT (*) INTO VAL FROM :TABLE_NAME WHERE
      :CONDITION';
BEGIN 
      EXECUTE IMMEDIATE SQL_CODE USING TABLE_NAME ,CONDITION;
      RETURN VAL;
EXCEPTION
      WHEN NO_DATA_FOUND THEN
      RETURN 0;
END;
Run Code Online (Sandbox Code Playgroud)

该函数已成功创建,但是当我尝试使用此代码使用它时:

BEGIN DBMS_OUTPUT.PUT_LINE(CHECK_EXISTS('EMPLOYEES' ,'DEPARTMENT_ID=50')); END;
Run Code Online (Sandbox Code Playgroud)

我收到异常:ORA-00903:表名无效。

oracle plsql

2
推荐指数
1
解决办法
2576
查看次数

如何将带时区的字符串转换为日期

如何在 Oracle 中将以下字符串转换为日期

Wed Jan 13 23:01:24 GMT 2016
Run Code Online (Sandbox Code Playgroud)

在下面尝试过,这个获取的日期为

SELECT TO_CHAR(SYSDATE, 'DY MON DD HH24:MM:SS YYYY') FROM dual;

FRI AUG 26 14:08:04 2016
Run Code Online (Sandbox Code Playgroud)

最终,想要这样的东西

SELECT TO_CHAR('Wed Jan 13 23:01:24 GMT 2016', 'DY MON DD HH24:MM:SS ??? YYYY') FROM dual;
Run Code Online (Sandbox Code Playgroud)

oracle plsql date to-char to-date

2
推荐指数
1
解决办法
3341
查看次数

将变量分配给 PL/SQL 块内的子查询结果

这是一些更简化的伪代码,描述了我正在尝试做的事情:

DECLARE
  CURSOR CURSOR_A IS
    SELECT FIELD_A1, FIELD_A2
    FROM TABLE_A;
vNAME NVARCHAR2(100) := NULL;
BEGIN
FOR RECORD_A IN CURSOR_A LOOP
  IF (RECORD_A.FIELD_A1 IS NOT NULL) THEN
    vNAME := RECORD_A.FIELD_A1;
  ELSE
    vNAME := (SELECT FIELD_B
                FROM TABLE_B
               WHERE TABLE_B.B2 = RECORD_A.A2)
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)

不允许在 PL/SQL 块中包含 SELECT 语句吗?

oracle plsql

2
推荐指数
1
解决办法
3792
查看次数

如何在 Oracle AQ 中停止和启动队列

我必须使用哪些命令来停止或启动 Oracle AQ 队列?

我需要停止队列以执行维护和分析,然后在分析完成后启动队列。

plsql oracle-aq

2
推荐指数
1
解决办法
1万
查看次数

遍历表 PL/SQL 中的所有行

从 table1 我想从某些列收集值。首先,我尝试将一张表复制到另一张表,但在尝试时卡住了:

for row in row_count
    for column in column_count
        insert into table2 at (x,y) value from (row,column)
        column++
    end
row++
end
Run Code Online (Sandbox Code Playgroud)

我计算行数的第一个函数是:

create or replace FUNCTION func_count_rows(table_name IN varchar2,
debug boolean default false)
RETURN number IS
   total number(2) := 0;
BEGIN

IF debug = true THEN 

DBMS_OUTPUT.put('Function count rows: ');
DBMS_OUTPUT.PUT_LINE('select count(*) from ' || table_name || ';');
DBMS_OUTPUT.put('Returns: ');
DBMS_OUTPUT.PUT_LINE('');

   END IF;


execute immediate 'select count(*) from ' || table_name into total;

   RETURN total;
END;
Run Code Online (Sandbox Code Playgroud)

然后我的程序首先打印值,但我卡在这里:

create …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

2
推荐指数
1
解决办法
3万
查看次数

标签 统计

plsql ×10

oracle ×9

oracle11g ×2

date ×1

exception ×1

oracle-aq ×1

sqlplus ×1

to-char ×1

to-date ×1