我在PL/SQL包中有以下代码行
l_sql := 'alter table LOG_FILES location ('||chr(39)|| filename || to_char(sysdate,'DDMMYY') ||chr(39)||'))';
execute immediate l_sql;
Run Code Online (Sandbox Code Playgroud)
pl/sql包编译得很好,但我没有看到变化.alter命令完全没有效果.这有什么理由吗?
注意:我尝试更改的表是Oracle External表.
当我执行这个PL/SQL块时,我一直收到"没有找到数据".如果我注释掉输出行,那么一切都按照我的怀疑输出,但更新语句永远不会执行.有任何想法吗?
set serveroutput on;
Declare
TYPE type_emp IS RECORD(
emp_salary emp.salary%TYPE);
rec_emp type_emp;
v_stars varchar2(50) ;
v_count number(3);
s_num number(3);
begin
SELECT min(employee_id) into s_num from emp;
SELECT count(*) into v_count from emp;
v_count := v_count + s_num;
for i in s_num .. v_count loop
SELECT salary
into rec_emp
from emp
where employee_id = i;
if rec_emp.emp_salary <1000 then
v_stars := null;
elsif rec_emp.emp_salary >=1000 and rec_emp.emp_salary <2000 then
v_stars := '*';
elsif rec_emp.emp_salary >=2000 and rec_emp.emp_salary <3000 then
v_stars …Run Code Online (Sandbox Code Playgroud) 从批处理文件执行时,下面的代码块没有运行.它只是挂起(没有任何反应).它坐在那里几个小时.我无法跟踪问题是什么或如何调试它.请帮忙.
declare
v_personrefid varchar2(50);
v_hiredt date;
v_loaddt date;
v_personid number;
v1_personrefid varchar2(50);
v_seq number :=0;
cursor get_row is
select distinct personrefid from ARCHIVE_PERSON;
cursor get_row1 is
select
personrefid,
hiredt,
loaddt,
personid
from
ARCHIVE_PERSON
where
personrefid = v_personrefid
order by hiredt, loaddt;
begin
v_seq:=0;
open Get_row;
loop
fetch get_row into v_personrefid ;
exit when get_row%notfound;
begin
open get_row1;
loop
fetch get_row1 into v1_personrefid, v_hiredt, v_loaddt, v_personid;
exit when get_row1%NOTFOUND;
v_seq:= v_seq+1;
update ARCHIVE_PERSON
set version = v_seq
where
personrefid = v1_personrefid …Run Code Online (Sandbox Code Playgroud) 我正在使用NamedParameterJdbcTemplate运行pl/sql脚本.但我不知道如何获得out变量的值(:id_out).提前致谢.
String script = "declare
begin
if myFunc(:id_in) is null then
:id_out := 0;
else
:id_out := 1;
end if;
end;";
Map<String,Object> bindVars = new HashMap<String, Object>();
bindVars.put(id_in,1);
bindVars.put(id_out,2);
jdbcTmpl.execute(script, bindVars, new PreparedStatementCallback<Object>() {
@Override public Object doInPreparedStatement(PreparedStatement cs)
throws SQLException, DataAccessException {
cs.execute();
return null;
}
}
);
Run Code Online (Sandbox Code Playgroud) 因为它发生在封闭的块中
如果一个匿名块调用一个引发异常的函数,那些既不会显示在控制台上也不会被封闭在块中......
更有甚者,在被函数中的处理程序捕获后,在匿名函数调用之后的行块正常执行!
被叫程序是:
CREATE OR REPLACE PROCEDURE qt(pno number, qty OUT number)
IS
BEGIN
select sum(qty_on_hand) into qty from products where productno=pno;
END;
Run Code Online (Sandbox Code Playgroud)
调用块是:
DECLARE
qty number;
BEGIN
qt(&pno, qty);
dbms_output.put_line('qty is: '||qty);
END;
Run Code Online (Sandbox Code Playgroud)
如果产品编号无效,则不会显示错误; 为什么?
create or replace procedure ppp(ot OUT number)
is
begin
null;
end;
/
Run Code Online (Sandbox Code Playgroud)
这在被调用时工作正常.
在Plsql中,我希望在遇到特定异常时创建声音(Beep).我试图在许多搜索引擎中搜索,但仍然没有得到关于这个主题的正确结果和研究材料.如果有人知道这一点,那么这对我来说通过使用PLSQL本身来实现这个功能非常有帮助.其他选项我必须调用Java函数来播放音频文件,这是我的最后一个选项.但是第一手我只想借助PLSQL代码来做这件事,这样我的代码就不会依赖Java(或C或任何其他语言).
是否有可能在PLSQL代码中产生声音?如果有人有任何想法,任何建议,任何起点或任何学习材料..请提供.
我们的DBA要求我们从一组关联数组中返回存储过程中的所有表格数据,而不是使用我在Web上的大多数示例中看到的引用游标.他说这是因为Oracle以这种方式做事要快得多,但这对我来说似乎很直观,因为数据需要循环两次,一次在存储过程中,然后再在应用程序中进行处理.此外,值通常需要从其本机类型转换为varchar,以便它们可以存储在数组中,然后在应用程序端进行转换.使用这种方法也很难使用orm工具,因为在大多数情况下它们似乎都需要ref游标.
存储过程的示例如下:
PROCEDURE sample_procedure (
p_One OUT varchar_array_type,
p_Two OUT varchar_array_type,
p_Three OUT varchar_array_type,
p_Four OUT varchar_array_type
)
IS
p_title_procedure_name VARCHAR2(100) := 'sample_procedure';
v_start_time DATE :=SYSDATE;
CURSOR cur
IS
SELECT e.one, e.two, e.three, e.four FROM package.table
WHERE filter='something';
v_counter PLS_INTEGER := 0;
BEGIN
FOR rec IN cur LOOP
BEGIN
v_counter := v_counter + 1;
p_One(v_counter) := rec.one;
p_Two(v_counter) := rec.two;
p_Three(v_counter) := rec.three;
p_Four(v_counter) := rec.four;
END;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
游标用于为返回的每列填充一个数组.我试图找到支持他声称这种方法更快但却无法做到这一点的信息.任何人都可以填写我可能希望我们(.net开发人员)以这种方式编写存储过程的原因吗?
我有两张桌子 -
create table mobile
(
id int,
m_name varchar(20),
purchase_date datetime
)
insert into mobile values('1','Samsung corby','12-JAN-12');
insert into mobile values('2','Nokia E5','15-MAR-12');
insert into mobile values('3','Sony Talk','10-FEB-12');
create table location
(
id int,
l_name varchar(20)
)
insert into location values(1,'London');
insert into location values(2,'Washington');
insert into location values(3,'Mexico');
Run Code Online (Sandbox Code Playgroud)
我想创建一个触发器,以确保在12月份无法购买墨西哥的索尼移动设备.这意味着每当我尝试在ID为3且purchase_date为12月的移动表中插入数据时,触发器应该停止并且给出适当的信息.
我的代码是 -
create or replace trigger trg1
before insert or update
on mobile
for each row
declare
var1 number(4);
begin
select id into var1 from location where l_name='Mexico';
IF (:new.id …Run Code Online (Sandbox Code Playgroud) 我正在寻找创建一个有助于调试特定变量的过程,为了重新使用,我想将它存储在它自己的过程中,并在需要时传入特定的变量,如
debugz(var_x);
Run Code Online (Sandbox Code Playgroud)
并且调试过程将执行以下操作 -
PROCEDURE debugz (var_x VARCHAR2(1000))
AS
BEGIN
DBMS_OUTPUT.put_line ('Variable value: '|| var_x || ' | Line number: ' || $$plsql_line ||' | Unit: '|| $$plsql_unit);
END;
Run Code Online (Sandbox Code Playgroud)
问题是,我希望PL/SQL行号和PL/SQL单元基于过程调用的起源,即" debugz(var_x);" 的行/单元.无论如何,debugz输出该行号而不传递其他信息?