标签: plsql

ORA-01002: 使用 @transactional 时不按顺序提取

当我尝试从我的应用程序调用一个过程时出现错误,提示ORA-01002: fetch out of sequence

使用的技术:

  • Mybatis 3
  • 春季MVC

这里有趣的一点是,只有当我对服务类中的调用方法使用@Transactional (org.springframework.transaction.annotation.Transactional) 注释时才会发生错误。如果我删除@Transactional,则没有 ORA 错误。

我正在使用 @Transactional,因为我将几个 DAO 注入到服务中。请找到我粘贴在下面的代码。

@Transactional
    public boolean saveavgFlyHrs(AverageFlyingHoursReport averageFlyingHoursReport) throws TransactionDataException {
        String status = null;
        boolean isOk = false;
        if(averageFlyingHoursReportDAO.saveavgFlyHrs(averageFlyingHoursReport)) {
            status = averageFlyingHoursReportDAO.updateCheckEff(averageFlyingHoursReport.getSubFleet());
            logger.debug("OUT_STATUS:"+status);
            if(ConstantStringUtil.SUCCESS.equalsIgnoreCase(status)) {
                isOk = true;
            } else {
                isOk = false;
            }
        }
        return isOk;
    }
Run Code Online (Sandbox Code Playgroud)

任何人请帮助我。

oracle spring plsql spring-mvc mybatis

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

PL/SQL Commit Issue

I have the following code:

BEGIN
DBMS_SCHEDULER.DROP_JOB (
job_name => 'MYJOB');
END;

COMMIT;
Run Code Online (Sandbox Code Playgroud)

I get the following error message:

Error report: ORA-06550: line 6, column 1: PLS-00103: Encountered the symbol "COMMIT" 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:

What is the problem with the syntax I am using for committing?

plsql oracle-sqldeveloper

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

如何知道用户是否拥有对象权限?

我想知道用户是否拥有对象的权限。

我正在研究 SQL Developer。

当我手动查询表DBA_TAB_PRIVS 时,我得到了所有需要的信息。

但是,我需要在某些触发器和函数中使用这些信息。

因此,我正在编写 PL/SQL 函数,如果角色具有特权,则返回 1,否则返回 0。

CREATE OR REPLACE FUNCTION HAS_PRIVILEGE_ON_OBJECT(rolename      IN VARCHAR2,
                                                   objectname    IN VARCHAR2,
                                                   objectowner   IN VARCHAR2,
                                                   privilegename IN VARCHAR2)
  RETURN NUMBER
AS
  output NUMBER;
  BEGIN

    SELECT count(*) INTO output
      FROM dba_tab_privs
     WHERE grantee = rolename
       AND owner = objectowner
       AND table_name = objectname
       AND privilege = privilegename;

    IF output > 0 THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END has_privilege_on_object;
Run Code Online (Sandbox Code Playgroud)

该函数不编译并说:

ORA 942:表或视图不存在。

连接的用户可以访问视图 DBA_TAB_PRIVS,因为我可以查询它,但是在尝试使用函数自动化它时。它不起作用。

请问有什么想法吗?

sql oracle privileges plsql

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

无法使用 PL/SQL 在 CMD 中打印结果

我是 PL/SQL 的新手,我在命令提示符中运行了一个简单的 Hello world 命令。

DECLARE 
message varchar2(20):= 'Hello, World!'; 
BEGIN 
dbms_output.put_line(message);
END;
/
Run Code Online (Sandbox Code Playgroud)

但是,尽管我收到消息 PL/SQL 程序成功完成消息,但 hello world 并没有显示在 CMD 中。请帮忙!

sql oracle plsql

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

变量作为 Oracle PL/SQL 中 where 子句中的列名

我正在处理 PL/SQL 代码,我需要在 where 子句中使用变量作为列名来执行选择查询。列名作为 varchar 存储在表中,我使用循环将这些列名传递给我的 select 语句。

请找到我正在尝试运行的示例代码段:

set serveroutput on;

declare
var varchar2(100);
counter number;
begin

var:='description';
select count(*) 
into counter
            from nodetable
           where  var like '%Ship%';

dbms_output.put_line(counter);
end;
Run Code Online (Sandbox Code Playgroud)

输出:

anonymous block completed
0
Run Code Online (Sandbox Code Playgroud)

但是结果应该是 86。Oracle 将最后一个条件作为两个字符串而不是 column=string 进行比较。

请让我知道这在 oracle 中是否可行,或者是否有解决方法。

问候 Ankit

sql database oracle plsql

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

创建或替换全局子类型

我知道我可以在包规范中创建一个子类型,例如:

CREATE OR REPLACE PACKAGE XY
AS
  SUBTYPE type_sdebug IS VARCHAR (200);
  ...
END;
/
Run Code Online (Sandbox Code Playgroud)

如果我想在另一个包中使用相同的子类型,那么我需要再次重新定义相同的类型。有没有办法创建或替换全局子类型,例如:

CREATE OR REPLACE TYPE STRING_ARRAY AS VARRAY(500) OF VARCHAR2(30);
/
Run Code Online (Sandbox Code Playgroud)

oracle plsql subtype

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

DBMS OUTPUT PUT 不打印任何内容

我是 PL/SQL 的新手,我想显示以下消息。当我在 SQL Developer 中编译它时,我只会得到

  PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

我的代码是这样的:

SET SERVEROUTPUT ON;

DECLARE
  mesaj VARCHAR2 (100) := 'PL/SQL';
BEGIN
  DBMS_OUTPUT.PUT(mesaj);
END;
/
Run Code Online (Sandbox Code Playgroud)

oracle plsql dbms-output

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

PL-SQL 从对象表中删除项目

我正在尝试从对象类型表的变量中删除一个项目:

CREATE OR REPLACE TYPE "T_ATTRIBUTEPAGE_ATTRIBUTELIST"  IS TABLE OF o_ATTRIBUTEPAGE_ATTRIBUTELIST;

CREATE OR REPLACE TYPE "O_ATTRIBUTEPAGE_ATTRIBUTELIST" IS OBJECT (
    WizAttrEditID           NUMBER,
    InternalIndex           NUMBER,
    DimensionObjectID       NUMBER,
    AttributeName           VARCHAR2(50),
    AttributeLabel          VARCHAR2(50),
    AttributeType           NUMBER,
    AttributeLength         VARCHAR2(50),
    MandatoryAttribute      NUMBER,
    ReadOnly                NUMBER,
    Name                    VARCHAR2(2000),
    Num                     NUMBER,
    IsModified              NUMBER,
    Colour                  NUMBER);
Run Code Online (Sandbox Code Playgroud)

我正在遍历对象列表,我检查了它ls_attr_list.COUNT是 16,当满足条件时我尝试删除一个项目,但我收到此错误:

ORA-01403: 未找到数据

这是在这一行提出的: ls_attr_list.Delete(i);

FOR i IN 1..ls_attr_list.COUNT LOOP
           BEGIN
               IF ls_attr_list(i).attributename = 'PROTECTION_ROLE' THEN
                   ls_attr_list.Delete(i);
                END IF;
               EXCEPTION WHEN OTHERS THEN
                 writelog(SQLERRM,'ERROR');
                 END;
            END LOOP;
Run Code Online (Sandbox Code Playgroud)

ls_attr_list 用输入参数初始化:

PROCEDURE AttribInit(geninfo        IN OUT …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

动态 SQL/异常处理 -00942 - Oracle PL/SQL

最初我试图创建一个异常来捕获一个不存在的表 (-00942)。根据 Alex 和 Raj 的反馈,我修改了代码以使用 EXECUTE IMMEDIATE。这有助于识别表,但是当我将表从“员工”更正为“员工”时,这是我数据库中存在的表,我本来希望代码运行时不会出错,就像我没有使用 EXECUTE IMMEDIATE 一样.

使用 EXECUTE IMMEDIATE 时,代码是否可以无异常地运行,而不是生成 catch all 异常?

EXECUTE IMMEDIATE 'SELECT last_name INTO v_name FROM Employees WHEREsalary = v_sal';

WHEN OTHERS THEN :g_message := '发生了其他一些错误。';

我希望代码能够无一例外地运行。

VARIABLE g_message VARCHAR2(250)

DEFINE p_sal = 12000

DECLARE 
   v_name employees.last_name%TYPE;
   v_sal employees.salary%TYPE := &p_sal;

   table_does_not_exist exception;  
   PRAGMA EXCEPTION_INIT(table_does_not_exist, -942);

BEGIN

   EXECUTE IMMEDIATE
   'SELECT last_name INTO v_name FROM employees WHERE salary = v_sal';

   DBMS_OUTPUT.put_line(v_name);


 EXCEPTION 

   WHEN table_does_not_exist then 
   :g_message := 'table dose not exist';  


   WHEN …
Run Code Online (Sandbox Code Playgroud)

plsql exception-handling dynamic-sql ora-00942 oracle-sqldeveloper

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

sysdate-1 在 Oracle 作业中不起作用

我在 Oracle 中有一个存储过程。我想在 Oracle 的 JOBS 中调用它。

DECLARE 
  P_DATE   DATE;
  BEGIN    

  P_DATE := TO_DATE ('19/10/2016', 'DD/MM/YYYY');

  MITRA.PENJUALAN_ANTAR_CABANG.REPORTKONSOLRK ( P_DATE );
  COMMIT; 
END;
Run Code Online (Sandbox Code Playgroud)

当我将 P_DATE 执行为“19/10/2016”时,结果是正确的。但是当我像下面这样更改时,结果不会显示。

DECLARE
   P_DATE   DATE;
BEGIN
   P_DATE := TO_DATE (TRUNC (SYSDATE - 1), 'DD/MM/YYYY');

   MITRA.PENJUALAN_ANTAR_CABANG.REPORTKONSOLRK (P_DATE);
   COMMIT;
END;
Run Code Online (Sandbox Code Playgroud)

我的查询错误是什么,而如果我运行select trunc(SYSDATE-1) from dual日期是正确的。

sql oracle plsql date

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