标签: plsql

带引号的动态sql并立即执行

我使用动态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行

oracle plsql oracle10g

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

在PL/SQL VARRAY中使用ROWTYPE会产生编译错误

如果我尝试下面的代码,那么它工作正常:

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)

为什么会出现编译错误?

sql oracle plsql oracle10g

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

SQL在特定日期选择重复项

我试图在同一天找到重复的条目.我有一个数据库表,它基本上只包含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创建过程的情况下执行此操作?谢谢你的建议.

sql select plsql duplicates

2
推荐指数
2
解决办法
599
查看次数

Oracle中带有函数的DETERMINISTIC和PARALLEL_ENABLED之间的区别

就数据访问限制而言,Oracle函数中deterministic的并行启用子句与并行启用子句有何区别?

oracle plsql function

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

当你试图避免使用魔术数字作为字符串长度时,是否使用PL/SQL代码中的错误练习clob类型?

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 types plsql

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

如何编译ORACLE触发器

我有一个无效的ORACLE触发器.

如何用SQL*PLUS编译它?

如何通过SQL*PLUS查看状态?

oracle plsql sqlplus

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

如何将Oracle PL/SQL包中的电子邮件发送到多个接收器?

如何将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)

oracle plsql oracle11g plsqldeveloper

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

SELECT INTO之前使用SELECT COUNT(*)比使用Exceptions慢吗?

我的最后一个问题让我思考.

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个优越的情况,我不在考虑?

编辑:我会让这个问题再挂几天,在答案之前收集一些更多的选票.

oracle plsql oracle10g

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

PL/SQL中的检查值列表为NULL

有没有办法检查是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),''如果列表为空,它将返回.

java sql plsql

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

为什么使用varchar2而不是char作为包常量?

刚刚遇到一个包,它定义了大量的包全局常量字符串,如下所示:

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版.

oracle plsql

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