【问题标题】:Unable to create table using pl/sql无法使用 pl/sql 创建表
【发布时间】:2011-12-13 02:53:28
【问题描述】:
declare
type yy is table of t12.name%type index by binary_integer;
y yy;
n number:=1;
begin
execute immediate 'create table rat1 ( name varchar2(10) )';
commit;

select name bulk collect into y from t12;
for i in (select id,name from t12)
loop
dbms_output.put_line(y(n));
n:=n+1;
end loop;
forall i in y.first..y.last
insert into rat1 values(y(i));
end;

它给了ora-00942。 我查了一下...在某些网站上提到您必须提供以下特权...

grant select on sys.v_$paramenter to abc

我也无法做到这一点..任何人都可以帮助我解决这个问题

【问题讨论】:

  • 另外......我不想在这里使用任何过程或游标的概念......
  • 请注意,在 PL/SQL 中使用 EXECUTE IMMEDIATE 执行 DDL 不是一个好主意。您应该在独立于 PL/SQL 代码的 SQL 脚本中执行此操作。 PL/SQL 不是用来创建表之类的。

标签: oracle plsql oracle10g oracle11g relational-database


【解决方案1】:

改变它,让它在 2 个连续的步骤中执行(不像现在这样在一个 PL/SQL 匿名块中):

先这个

begin
execute immediate 'create table rat1 ( name varchar2(10) )';
commit;
end;

然后作为第二个阻止这个

declare
type yy is table of t12.name%type index by binary_integer;
y yy;
n number:=1;
begin

select name bulk collect into y from t12;
for i in (select id,name from t12)
loop
dbms_output.put_line(y(n));
n:=n+1;
end loop;
forall i in y.first..y.last
insert into rat1 values(y(i));
end;

编辑 - 根据评论:

在执行整个 PL/SQL 块之前解析整个 PL/SQL 块 - PL/SQL 块中使用的所有对象必须在执行 PL/SQL 块之前存在...

【讨论】:

  • 谢谢....如果我理解正确..那么。在 1 个 pl/sql 块成功执行之前,任何 DDl 都不会生效
  • 目标:没有什么我只是在学习 PL/SQL..所以只是在做实验..试验和错误....
  • no - 它生效但在执行之前解析整个 PL/SQL 块 - 因此 PL/SQL 块中使用的所有对象必须在执行 PL/SQL 块之前存在...请不要忘记投票/标记为已接受任何有帮助的答案...
  • 但我仍然无法做到......我尝试在嵌套开始中做到这一点,但它仍然显示该表不存在......
  • 我是否必须在单独的 sql 文件中执行它..然后一个接一个地执行它..因为这将是 obv 方式..我试图在同一个文件中执行它
【解决方案2】:

你应该分两个单独的块来做。

第一块:

begin
...
end;
/

斜线表示应将缓冲区发送到 DBMS 并进行评估。它指示您的 PL/SQL 代码在哪里结束和评估可以开始。

然后是下一个:

declare
...
begin
...
end;
/

因此,您有:

begin
...
end;
/
declare
...
begin
...
end;
/

它在 SQL*Plus 和 SQLDeveloper 下工作。

【讨论】:

  • 对我不起作用,我收到ORA-06550: line 277, column 1: PLS-00103: Encountered the symbol "BEGIN。此外,当我输入斜杠时,会出现语法错误。我使用 SQLDeveloper。
  • 请注意省略号...必须改为实际工作代码。
  • 是的,我想通了。
  • 那么你需要用有问题的代码发布一个问题。我们需要更多信息。
  • 谢谢@LudovicKuty 我会的。
【解决方案3】:

如果在 SQLPlus 块中工作,所有 DDL 更改都必须使用 立即执行 来执行。 不幸的是,这些更改在块完成执行之前是不可见的。

要解决此问题,请使用 立即执行 来处理所有依赖于以前“隐藏”更改的以下语句。这也适用于 DML 语句。在你的情况下:

...
execute immediate 'insert into rat1 values('||y(i)||')';
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多