我使用动态sql和引号绊倒了.当我dbms_output sql_stmt时,它输出有效/工作代码.应该如何编写sql_stmt:=行以便我可以动态执行它?我试过":1使用"绑定变量语法也没有运气.
此代码的要点是收集表子集的统计信息.
set serveroutput on
--create this test table for working example.
--create table test3 as select table_name from user_tables where rownum <= 5;
declare
sql_stmt varchar2(500);
begin
for rec in (select table_name from test3)
loop
sql_stmt := 'exec dbms_stats.gather_table_stats (''SCOTT'',''' || rec.table_name || ''')';
dbms_output.put_line(sql_stmt);
execute immediate sql_stmt; -- <---Error is here---
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
我从execute immediate sql_stmt获得的错误; 行是:ORA-00900:无效的SQL语句ORA-06512:在第8行
如果我尝试下面的代码,那么它工作正常:
declare
type v_varray is varray(50) of emp%rowtype;
v_emp_details v_varray;
begin
select * bulk collect into v_emp_details from emp where dept_id = 1;
for i in 1 .. v_emp_details.count
loop
dbms_output.put_line('Emp Name : ' || v_emp_details(i).emp_name);
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试创建VARRAY作为这样的数据库对象:
create or replace type xyz is varray(20) of emp%ROWTYPE
Run Code Online (Sandbox Code Playgroud)
为什么会出现编译错误?
我试图在同一天找到重复的条目.我有一个数据库表,它基本上只包含ID,USERNAME和DATE_CREATED.
我需要一个大致如此的选择:
SELECT USERNAME,DATE_CREATED
FROM THE_TABLE WHERE {more than one USERNAME exists on date TRUNC(DATE_CREATED)}
Run Code Online (Sandbox Code Playgroud)
是否可以在不通过SELECT创建过程的情况下执行此操作?谢谢你的建议.
就数据访问限制而言,Oracle函数中deterministic的并行启用子句与并行启用子句有何区别?
PL/SQL变量声明需要设置varchar2类似的类型:
declare
query varchar2(2000);
begin
for i in 1..100 loop
query := query || to_char(i);
end loop;
dbms_output.put_line(query);
end;
/
Run Code Online (Sandbox Code Playgroud)
当产品需求发生变化时我在陷阱中运行,因此循环范围变大(在我的示例中将范围设置为1..1000)并且我收到错误:
ORA-06502: PL/SQL: : ????? ?????????? ????? ??????? ????????? ?????? ????? ??? ???????? ORA-06512: ?? line 5
Run Code Online (Sandbox Code Playgroud)
所以我需要在任何地方增加查询长度,甚至用更大的数字来预测未来.
这很难看.我不是PL/SQL的专家,但通过阅读官方文档我发现clob类型不需要长度和快速检查显示代码有效!
PL/SQL代码变得更像Pascal,更像Python/Ruby/Perl.我很喜欢.
我只对动态构建的字符串应用类型转换,这些字符串不是强调循环使用.
这种技术是正确的还是我错了?
PS我是PL/SQL编程的新生,所以问这样愚蠢的问题......
PPS工作代码之一(简化):
queryStr := 'create or replace view "DATA_VIEW" ("DT", "MONEY", "EVENT") as ( ';
for eventRec in eventCur
loop
queryStr := queryStr || 'select DT, MONEY, ' …Run Code Online (Sandbox Code Playgroud) 我有一个无效的ORACLE触发器.
如何用SQL*PLUS编译它?
如何通过SQL*PLUS查看状态?
如何将Oracle PL/SQL包中的电子邮件发送到多个接收器?我在oracle包中有pl/sql程序,它只适用于一个接收器.我需要改进它的功能,让它可以同时向多个接收器发送电子邮件,如"To:David Festool; Peter Makita; John Dewalt".任何身体都可以帮助我,非常感谢!请提供修改后的代码.
procedure email(p_recip in varchar2,
p_subject in varchar2,
p_message in varchar2) is
c utl_smtp.connection;
msg varchar2(4000);
procedure send_header(name in varchar2, header in varchar2) as
begin
utl_smtp.write_data(c, name || ': ' || header || utl_tcp.crlf);
end;
begin
--Open SMTP connection
c := utl_smtp.open_connection('ExchangeServerName');
-- Write SMTP header
utl_smtp.helo(c, 'ExchangeServerName');
utl_smtp.mail(c, 'Email@MyCompany.on.ca');
utl_smtp.rcpt(c, p_recip);
utl_smtp.open_data(c);
send_header('From', '"Title" <Email@MyCompany.on.ca');
send_header('To', p_recip);
send_header('Subject', p_subject);
send_header('Mime-Version', '1.0');
send_header('Content-Type', 'multipart/mixed; boundary="DMW.Boundary.605592468"');
-- Write MIME boundary line for the message body …Run Code Online (Sandbox Code Playgroud) 我的最后一个问题让我思考.
1)
SELECT COUNT(*) INTO count FROM foo WHERE bar = 123;
IF count > 0 THEN
SELECT a INTO var FROM foo WHERE bar = 123;
-- do stuff
ELSE
-- do other stuff
END IF;
Run Code Online (Sandbox Code Playgroud)
2)
BEGIN
SELECT a INTO var FROM foo where bar = 123;
-- do stuff
EXCEPTION
WHEN no_data_found THEN
--do other stuff
END ;
Run Code Online (Sandbox Code Playgroud)
我假设2号更快,因为它需要少一次数据库.
是否存在1个优越的情况,我不在考虑?
编辑:我会让这个问题再挂几天,在答案之前收集一些更多的选票.
有没有办法检查是NULLPL/SQL 中的值列表?
我有类似的东西:
SELECT * FROM myTable t WHERE t.dataId IN (:myList) OR :myList IS NULL
Run Code Online (Sandbox Code Playgroud)
在运行时,:myList符号代替字符串列表,例如
SELECT * FROM myTable t WHERE t.dataId IN ('a', 'b', 'c') OR ('a', 'b', 'c') IS NULL
Run Code Online (Sandbox Code Playgroud)
我已经意识到这('a', 'b', 'c') IS NULL是无效的PL/SQL,所以我想知道是否有另一种方法可以检查值列表NULL.
我试图模仿的行为将评估('a', 'b', 'c')为NOT NULL.我试图避免创建另一个变量(例如:myListFlag),''如果列表为空,它将返回.
刚刚遇到一个包,它定义了大量的包全局常量字符串,如下所示:
DESTINATION_1 CONSTANT VARCHAR2(13) := '515 Pine Lane';
DESTINATION_2 CONSTANT VARCHAR2(18) := '670 Woodhaven Lane';
Run Code Online (Sandbox Code Playgroud)
使用varchar2这些数据类型是否有任何好处char?
使用Oracle 11g第2版.