标签: plsql

如果不存在,在 oracle 11g 中设置 NLS_DATE_FORMAT 以截断时间

我在 PLSQL 中有一个 SELECT 查询,它包含多个 DATE 列,其中一些列还包含 TIME。日期和时间必须以标准格式显示,即;DD/MM/YYYY HH:MI:SS AM所以在执行查询之前我设置了 NLS_DATE_FORMAT 参数:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH:MI:SS AM';

这里的问题是那些只有日期(没有时间)的列也在结果集中显示默认时间,即;中午 12:00:00

在此处输入图片说明

oracle 有没有办法设置 NLS_DATE_FORMAT 参数,如果它不存在于 DATE 文件中,它会截断默认时间?

请注意,我知道 TO_CHAR 和 TRUNC 之类的方法可以实现所需的结果,但在我的情况下,我无法使用这些方法,因为它会影响我的应用程序中的数据排序。

sql oracle plsql

0
推荐指数
1
解决办法
819
查看次数

':' 冒号在 Oracle 中是什么意思?

 if (:new.first_name is not null) then
       :new.first_name := substr(regexp_replace(:new.first_name,'[^'||chr(1)||'-'||chr(127)||']',null),1,20);
    end if;
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我使用此代码吗?我不明白!

oracle plsql regexp-replace

0
推荐指数
1
解决办法
42
查看次数

Oracle PL/SQL 可以使用动态过程名称吗?

我试图通过循环传递我想要调用的过程的名称,因为我需要连续调用 3 个类似的过程。

让我们打电话给他们:

  1. 进程_A
  2. 进程_B
  3. 进程_C

它们每个都有 1 个输入变量和 2 个输出变量。

关于我可以改变什么来让它工作的任何想法?

FOR l_counter in 1..3
LOOP
    SELECT PROC_NAME into V_PROC FROM PROC_LIST WHERE PROC_ID = l_counter;

    EXECUTE IMMEDIATE 'PROC_DB.' || V_PROC || '(1,V_STEP_ERROR_CODE,V_STEP_MSG)';
    COMMIT;
END LOOP;
Run Code Online (Sandbox Code Playgroud)

第 5 行当前失败。(立即执行)带有:“无效的 SQL 语句”

sql oracle plsql dynamic-sql

0
推荐指数
1
解决办法
39
查看次数

如何使用私有过程创建 Oracle 包?

我正在创建一个 Oracle 包,我想知道是否可以将 prcedure 设为私有,这是我的示例代码:

CREATE OR REPLACE PACKAGE MYSCHEMA.MyPackage AS
 PROCEDURE MyProcedureA(outputParam OUT VARCHAR2);
 PROCEDURE MyProcedureB(inputParam IN VARCHAR2);
END MyPackage;

/

CREATE OR REPLACE PACKAGE BODY MYSCHEMA.MyPackage AS

 PROCEDURE MyProcedureA(outputParam OUT VARCHAR2) AS
  myHello VARCHAR2(1000) := 'Hello';
 BEGIN
  MyProcedureB(myHello);
  outputParam := 'OK';
 END MyProcedureA;

 PROCEDURE MyProcedureB(inputParam IN VARCHAR2) AS
  myWorld VARCHAR2(1000) := 'World';
 BEGIN
  dbms_output.put_line(inputParam || myWorld);
 END MyProcedureB;

END MyPackage;
Run Code Online (Sandbox Code Playgroud)

是否可以将 MyProcedureB 设为“私有”,我的意思是它只能由包 (MyProcedureA) 中的其他程序调用?

sql oracle plsql plsqldeveloper plsql-package

0
推荐指数
1
解决办法
33
查看次数

循环遍历所有行只返回最后一行

我正在尝试使用此 Plsql 将值返回到 Apex 页面项中。页面项源是 PL/SQL 函数体。

DECLARE
v_val VARCHAR2 (3000 CHAR);
  CURSOR c_mylist
  IS
  select * from table_mylist
  order by id;
  BEGIN
  FOR r_mylist IN c_mylist
  LOOP
   --dbms_output.put_line( c_mylist.item );
   v_val := c_mylist.item ||' '||c_mylist.item;
  END LOOP;
  return v_val;
END;
Run Code Online (Sandbox Code Playgroud)

出乎意料的是,它只将游标的最后一个值返回到页面项中,而不是所有行值。在 SQL Developer 中尝试使用 dbms_output.put_line 显示正确的结果。我的脚本出了什么问题?

oracle error-handling plsql return-value oracle-apex

0
推荐指数
1
解决办法
34
查看次数

如何在FROM子句中使用CASE语句来决定使用哪个表来获取Oracle中的数据?

我有两个表,HISTORY_DATA 和 CURRENT_DATA,我有一个输入参数 REPORT_DATE,根据以下条件,我必须获取数据:

IF(REPORT_DATE<=TRUNC(SYSDATE-40))THEN
         SCHD_TABLE:='HISTORY_DATA' ;
         ELSE
         SCHD_TABLE:='CURRENT_DATA';  
         END IF ; 
Run Code Online (Sandbox Code Playgroud)
  1. 我尝试使用动态 SQL,但它给出了无效表名的错误。

    SELECT * FROM ''||SCHD_TABLE||'' ;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 CASE STATEMENT 但它也给出了语法错误:

    SELECT * FROM (CASE WHEN REPORT_DATE<=TRUNC(SYSDATE-40) THEN HISTORY_DATA 
                        ELSE CURRENT_DATA 
                   END)
    
    Run Code Online (Sandbox Code Playgroud)

请指导如何解决这个问题。

sql oracle plsql

0
推荐指数
1
解决办法
55
查看次数

Oracle - 创建不更新旧数据的增量视图

是否可以创建一个仅增量的物化视图?我希望已经插入的旧数据不被更新,只有新的插入应该包含在视图中

如果可能,我该怎么做?

是否有任何文档或任何我可以用作指南的地方?

oracle plsql view

0
推荐指数
1
解决办法
74
查看次数

当我尝试运行以下 plsql 代码时,出现“ORA-00922:缺少或无效选项”错误。如何解决?

SET SERVEROUTPUT ON;
DECLARE
 var_test1 VARCHAR2(30) := 'RebellionRider';
BEGIN
    DBMS_OUTPUT.PUT_LINE (var_test1);
END;
Run Code Online (Sandbox Code Playgroud)

每当我运行上面的代码时,我都会收到以下错误。我使用 oracle apex 来运行我的代码。如何解决?
错误:-

ORA-00922: 缺少或无效的选项

BEGIN
     DBMS_OUTPUT.PUT_LINE (var_test1);
END;  
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql oracle-apex

0
推荐指数
1
解决办法
39
查看次数

将天/小时/分钟和月份添加到时间戳

有没有办法将天数小时数月和分钟添加到时间戳中,我想将其值插入到变量中

我有想要添加到时间戳的分钟、小时、天和月的单独变量

时间戳格式是这样的“04-FEB-21 10.25.12.013000 AM”

我尝试使用 SELECT TO_TIMESTAMP(datecreated,'dd-mon-yyyy hh.mi.ss AM') + daysvar into duedate FROM dual; 但它返回错误 AM/AM 或 PM/PM required

daysvar 包含要添加到时间戳的天数

谢谢!

sql oracle plsql

0
推荐指数
1
解决办法
38
查看次数

为什么我们需要在 Anonymus 块的最后一部分 BEGIN END(执行部分)?

当我尝试运行此代码时

DECLARE
TYPE type_a IS
    TABLE OF NUMBER INDEX BY PLS_INTEGER;
output NUMBER := 1;

FUNCTION fun_2 RETURN type_a IS
    dum type_a;
BEGIN
    SELECT
        employee_id
    BULK COLLECT
    INTO dum
    FROM
        employees;

    RETURN dum;
END fun_2;

PROCEDURE proc_1 AS
BEGIN
    NULL;
END;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误报告 - ORA-06550:第 22 行,第 8 列:PLS-00103:在预期以下情况之一时遇到符号“文件结束”:

begin function pragma procedure 06550. 00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。*行动:

但是当我最后添加 BEGIN END 时它工作正常

    DECLARE
    TYPE type_a IS
        TABLE OF NUMBER INDEX BY PLS_INTEGER;
    output NUMBER := …
Run Code Online (Sandbox Code Playgroud)

oracle plsql anonymous-function oracle11g oracle19c

0
推荐指数
1
解决办法
25
查看次数