如何在PL/SQL中在OS上创建物理目录?我查看了CREATE OR REPLACE DIRECTORY命令但是没有这样做.两者UTL_FILE似乎都没有能力.
使用Oracle 10g,我需要重命名一堆FK约束,这些约束都以LITE结尾以包含FK前缀.
我的想法是(我确保所有名称都足够短以容纳前缀):
DECLARE
v_name VARCHAR2(30 BYTE);
v_new_name VARCHAR2(30 BYTE);
CURSOR c1 is select CONSTRAINT name from user_constraints where constraint_type = 'R' and constraint_name like '%_LITE';
BEGIN
OPEN c1;
LOOP
FETCH c1 into v_name;
EXIT when c1%NOTFOUND;
v_new_name:= 'FK_' || v_name;
update user_constraints SET constraint_name = v_new_name where constraint_name = v_name;
END LOOP;
close c1;
END;
Run Code Online (Sandbox Code Playgroud)
任何原因导致不安全,我应该创建alter table语句?
在PL/SQL方面我很新,我必须修改其他人的存储过程.
是否可以在select中间添加if语句?我尝试打开一个游标并从不同的表中选择一堆东西(不要问我为什么他们没有使用连接)并返回光标.我正在尝试做的事情是,有两列具有相似的数据,可以永远不会同时填充.因此,如果一个为null,则另一个应该有一个值,并且游标需要来自任何填充的值.那么...如果声明里面的选择?
我不会发布实际的代码,因为它会使你的眼球流血,但它看起来像......
open rc for
select l.data1 as ld1, l.data2 as ld2, b.data1 as bd1,
b.data2 as bd2, c.data1 as as c_d1, c.data2 as cd2
from tablel l, tableb b, tablec c
where blahblahblah
and c.data1 = [b.data3 if b.data4 is null, else b.data4]?
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我似乎无法获得语法.
我希望能够根据用户输入在表中插入可变数量的行?例如.
Please enter value, enter "done" when no more values: value 1
Please enter value, enter "done" when no more values: value 2
Please enter value, enter "done" when no more values: done
2 Rows inserted successfully.
Run Code Online (Sandbox Code Playgroud)
我不确定如何临时存储行,我不知道如何多次询问用户插入数据.pl/sql有数组吗?
谢谢
在Oracle中执行以下操作的查询是什么?
我们使用PL/SQL表(名为pTable)来收集许多要更新的ID.
但是,声明
UPDATE aTable
SET aColumn = 1
WHERE id IN (SELECT COLUMN_VALUE
FROM TABLE (pTable));
Run Code Online (Sandbox Code Playgroud)
需要很长时间才能执行.
似乎优化器提出了一个非常糟糕的执行计划,而不是使用在id(作为主键)上定义的索引,它决定在aTable上使用全表扫描.pTable通常包含很少的值(在大多数情况下只有一个).
我们可以做些什么来加快速度?我们提出的最好的是处理低pTable.Count(1和2)作为特殊情况,但这当然不是很优雅.
感谢所有伟大的建议.我在http://smartercoding.blogspot.com/2010/01/performance-issues-using-plsql-tables.html的博客中写了这个问题.
尝试在Oracle中执行包含两个输入参数的存储过程时,我收到以下错误:
ORA-06550:第1行第7列:
PLS -00306:调用
'P_GET_NEXT_AVAILABLE_RUN'ORA
-06550 时参数的数量或类型错误:第1行第7行:
PL/SQL:语句被忽略
两个输入参数都需要非空值.我无法单步执行代码,否则我将能够看到哪个值为null - 所以 - 在Oracle中有哪种方法可以看到存储过程生成的错误 - 所以我可以确定哪个参数得到了空值?
我试图在物化视图上执行刷新,但我无法编译脚本.
CREATE OR REPLACE PROCEDURE REFRESH_MV AS
BEGIN
exec DBMS_MVIEW.REFRESH('my_mat_view_mv','C');
END REFRESH_MV;
Run Code Online (Sandbox Code Playgroud)
我收到消息:
ORA-06550:第3行第9列:PLS-00103:遇到以下其中一项时遇到符号"DBMS_MVIEW":
:=.(@%;立即用符号":="代替"DBMS_MVIEW"继续.
难道我做错了什么 ?需要进口什么?
CREATE OR REPLACE PROCEDURE REFRESH_MV AS
BEGIN
EXECUTE DBMS_MVIEW.REFRESH('my_mat_view_mv','C');
END REFRESH_MV;
Run Code Online (Sandbox Code Playgroud)
(S1917)期待:(; @
IMMEDIATE
CREATE OR REPLACE PROCEDURE REFRESH_MV AS
BEGIN
EXECUTE IMMEDIATE DBMS_MVIEW.REFRESH('my_mat_view_mv','C');
END REFRESH_MV;
Warning: compiled but with compilation errors
Run Code Online (Sandbox Code Playgroud)
这是一个Oracle 10g XE,希望没问题.
提前致谢 !
给定(忽略缺少主键,外键等 - 这不是表设计,只是一个例子):
Order:
----------
ID NUMBER;
VENDOR NUMBER;
PART NUMBER;
Parts:
------------
ID NUMBER;
VENDOR NUMBER;
DESCRIPTION VARCHAR2(1000 CHAR);
cursor c1 is select * from order o left join parts p on o.part = p.id;
c_row c1%rowtype;
Run Code Online (Sandbox Code Playgroud)
如何区分将在联接中的两个VENDOR列?
我不认为我可以做c_row.value,因为那会是模棱两可的,我不认为像c_row.p.vendor这样的东西有效.
如何引用两个值列的特定实例?