是否可以在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,这在包外定义的类型中是不允许的.
谢谢,杰夫
我们使用Hudson和Maven构建软件.我们有C#,java和last,但并非最不重要的PL/SQL源(sprocs,package,DDL,crud)
对于C#和Java,我们进行单元测试和代码分析,但在实际将它们发布到目标数据库之前,我们并不真正了解PL/SQL源的健康状况.
有几件事我们不想在以下优先级中测试:
也,
我们做了一些研究,发现了以下可以提供帮助的工具:
到目前为止,Toad for Oracle和Sonar似乎是一个优雅的解决方案.但可能我们在这里遗漏了什么?
有任何想法吗?其他产品?经验?
oracle build-automation continuous-integration plsql code-analysis
我想执行匿名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)
任何回复都会非常有帮助.
在托管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已从死锁中恢复并成功完成更新,还是应该按顺序重新运行这些脚本?欢迎任何帮助.
提前致谢.
oracle数据库中是否有任何方法可以定义在COMMIT之前同步触发的触发器(如果抛出异常则抛出ROLLBACK)以防指定表被更改?
我有一个函数,它将返回一个类型的记录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)
谢谢.
我对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似乎能够以某种方式做到这一点.
谢谢
我有这样一张桌子(报告)
--------------------------------------------------
| 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) 我有一个表,其中包含一些包含一些空值的列.我想NOT NULL在该列上添加约束,而不将现有的null更新为非null值.我想保留现有的空值,并检查它们包含此列的非空值的未来行.这可能吗?怎么样?
我刚刚发现了我认为在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 ...
你有什么要对此说的? …