想象一下这个场景(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))
我正在阅读 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) 鉴于此字符串:
.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(),还是有一个函数可以用“和”替换最后一个空格?
我的脚本文件有以下代码:
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 编译错误时退出?
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
现在它在字符串的末尾留下空格。我已经放了一个 . 广告代码,使我的意思更清楚。开头和结尾没有空格。我试过这个,但它对我不起作用。
我想创建一个 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 中将以下字符串转换为日期
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) 这是一些更简化的伪代码,描述了我正在尝试做的事情:
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 AQ 队列?
我需要停止队列以执行维护和分析,然后在分析完成后启动队列。
从 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)