标签: plsql

可以在PL/SQL中创建Oracle数据库对象类型吗?

是否可以在Oracle Database 10g中的包内创建对象类型?就像是:

create or replace package my_package as 
    type my_type as object (
        id number(15) 
     ); 
end;
Run Code Online (Sandbox Code Playgroud)

得到:

错误(3,9):PLS-00540:此上下文中不支持该对象.

我最终希望能够做的是使用多态,但也允许对象访问表并使用PL/SQL,这在包外定义的类型中是不允许的.

谢谢,杰夫

oracle plsql

22
推荐指数
3
解决办法
4万
查看次数

PL/SQL预编译和自动构建环境中的代码质量检查?

我们使用Hudson和Maven构建软件.我们有C#,java和last,但并非最不重要的PL/SQL源(sprocs,package,DDL,crud)

对于C#和Java,我们进行单元测试和代码分析,但在实际将它们发布到目标数据库之前,我们并不真正了解PL/SQL源的健康状况.

要求

有几件事我们不想在以下优先级中测试:

  1. 来源是否有效,因此"可编辑"?
  2. 对于包,对于某个数据库,它们会编译吗?
  3. 代码质量:我们是否存在代码缺陷,如重复,过于复杂的方法或违反规定的规则集?

也,

  • 该工具必须运行无头(命令行,蚂蚁,...)
  • 我们想对部分代码库进行分析(仅限更改源)

工具

我们做了一些研究,发现了以下可以提供帮助的工具:

到目前为止,Toad for Oracle和Sonar似乎是一个优雅的解决方案.但可能我们在这里遗漏了什么?

有任何想法吗?其他产品?经验?

有关SO的相关问题:

oracle build-automation continuous-integration plsql code-analysis

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

执行匿名pl/sql块并在java中获取结果集

我想执行匿名PL/SQL并需要获取结果集对象.我得到的代码可以通过在PL/SQL块中使用游标来完成.

但是PL/SQL块本身将作为文本来自数据库.所以我无法编辑那个PL/SQL块.并且它将仅返回两个值,其列名将始终相同.它将返回2列组合值的列表.

这里我给出了PL/SQL示例.

BEGIN

RETURN 'select distinct fundname d, fundname r from <table> where condition order by 1';

EXCEPTION
   WHEN OTHERS THEN
    RETURN 'SELECT ''Not Available'' d, ''Not Available'' r FROM dual';
END;
Run Code Online (Sandbox Code Playgroud)

任何回复都会非常有帮助.

java plsql jdbc resultset

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

ORA-00060:等待资源时检测到死锁

在托管oracle 10g的AIX服务器上,我有一系列并行运行的脚本作为nohup.这些脚本由其他人编写,旨在同时执行.所有脚本都在表上执行更新.我收到了错误,

ORA-00060:等待资源时检测到死锁

当我用Google搜索时,我发现, http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm

即使脚本同时在同一个表上执行更新,它们也会对由WHERE子句确定的表的不同记录执行更新,而不会在它们之间重叠记录.

那么这会导致错误吗?

无论在表上执行更新的位置,都会发生此错误吗?

我应该一直避免在桌面上同时进行更新吗?

奇怪的是,PL/SQL successfully completed在上面引用的错误之后,我也在nohup.out日志中找到了 .

这是否意味着oracle已从死锁中恢复并成功完成更新,还是应该按顺序重新运行这些脚本?欢迎任何帮助.

提前致谢.

database unix oracle aix plsql

21
推荐指数
3
解决办法
10万
查看次数

如何在Oracle中定义触发器ON COMMIT?

oracle数据库中是否有任何方法可以定义在COMMIT之前同步触发的触发器(如果抛出异常则抛出ROLLBACK)以防指定表被更改?

sql oracle triggers plsql

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

检查plsql中的记录IS NOT NULL

我有一个函数,它将返回一个类型的记录my_table%ROWTYPE,并在调用者,我可以检查返回的记录是否为空,但PL/SQL抱怨if语句

PLS-00306:调用'IS NOT NULL'时参数的数量或类型错误

这是我的代码:

v_record my_table%ROWTYPE;
v_row_id my_table.row_id%TYPE := 123456;
begin
    v_record := myfunction(v_row_id)
    if (v_record is not null) then
        -- do something
    end if;
end;

function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is
    v_record_out my_table%ROWTYPE := null;
begin
    select * into v_record_out from my_table
    where row_id = p_row_id;
    return v_record_out;
end myfunction;
Run Code Online (Sandbox Code Playgroud)

谢谢.

plsql notnull

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

在Oracle中减去日期 - 数字或间隔数据类型?

我对Oracle DATE和INTERVAL数据类型的一些内部工作方式有疑问.根据Oracle 11.2 SQL Reference,当您减去2个DATE数据类型时,结果将是NUMBER数据类型.

粗略测试,这似乎是真的:

CREATE TABLE test (start_date DATE);
INSERT INTO test (start_date) VALUES (date'2004-08-08');
SELECT (SYSDATE - start_date) from test;
Run Code Online (Sandbox Code Playgroud)

将返回NUMBER数据类型.

但现在如果你这样做:

SELECT (SYSDATE - start_date) DAY(5) TO SECOND from test;
Run Code Online (Sandbox Code Playgroud)

你得到一个INTERVAL数据类型.换句话说,Oracle可以将NUMBER从DATE减法转换为INTERVAL类型.

所以现在我想我可以尝试直接在括号中输入NUMBER数据类型(而不是做'SYSDATE - start_date',这会导致NUMBER反正):

SELECT (1242.12423) DAY(5) TO SECOND from test;
Run Code Online (Sandbox Code Playgroud)

但这会导致错误:

ORA-30083: syntax error was found in interval value expression
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:这里发生了什么?似乎减去日期应该导致NUMBER(如SELECT语句#1中所示),它不能自动转换为INTERVAL类型(如SELECT语句#3中所示).但是,如果使用DATE减法表达式而不是放入原始NUMBER(SELECT语句#2),Oracle似乎能够以某种方式做到这一点.

谢谢

sql oracle plsql date oracle11g

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

LISTAGG功能有两列

我有这样一张桌子(报告)

--------------------------------------------------
|  user_id |  Department | Position  | Record_id |
--------------------------------------------------
|  1       |  Science    | Professor |  1001     |
|  1       |  Maths      |           |  1002     |
|  1       |  History    | Teacher   |  1003     |
|  2       |  Science    | Professor |  1004     |
|  2       |  Chemistry  | Assistant |  1005     |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想得到以下结果

   ---------------------------------------------------------
   | user_id  |  Department+Position                       |
   ---------------------------------------------------------
   |  1       | Science,Professor;Maths, ; History,Teacher |
   |  2       | Science, Professor; Chemistry, Assistant   | …
Run Code Online (Sandbox Code Playgroud)

oracle plsql oracle11g plsqldeveloper

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

如何在包含空值的列上添加非空约束

我有一个表,其中包含一些包含一些空值的列.我想NOT NULL在该列上添加约束,而不将现有的null更新为非null值.我想保留现有的空值,并检查它们包含此列的非空值的未来行.这可能吗?怎么样?

sql oracle plsql constraints oracle11g

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

为什么在FOR循环中通过表达式连接,只执行一次?

我刚刚发现了我认为在Oracle中PLSQL vs SQL中有些出乎意料的行为.

如果我在SQLDeveloper上运行此查询,我得到5个结果:

select level lvl from dual connect by level <=5;
Run Code Online (Sandbox Code Playgroud)

但是,如果我在SQLDeveloper中运行此语句:

declare
  w_counter number :=0;
begin
  for REC in (select level lvl from dual connect by level <=5)
  loop
    w_counter := w_counter+1;
  end loop;
  dbms_output.put_line('W_COUNTER: '|| w_counter);
end;
Run Code Online (Sandbox Code Playgroud)

变量w_counter以值1结束(很奇怪)

但最奇怪的部分是,如果我将查询封装在子查询中...类似于:

declare
  w_counter number :=0;
begin
  for REC in (select * from (select level lvl from dual connect by level <=5))
  loop
    w_counter := w_counter+1;
  end loop;
  dbms_output.put_line('W_COUNTER: '|| w_counter);
end;
Run Code Online (Sandbox Code Playgroud)

w_counter变量完成与价值5 ...

你有什么要对此说的? …

sql oracle plsql oracle9i

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