Oracle对新序列的使用
不确定这是否是提出此类问题的正确地点,如果不是,请接受我的道歉 我刚刚在我的用户模式中创建了一个新序列,可以使用: -->Oracle对新序列的使用,oracle,oracle11g,Oracle,Oracle11g,不确定这是否是提出此类问题的正确地点,如果不是,请接受我的道歉 我刚刚在我的用户模式中创建了一个新序列,可以使用: -->从Dual中选择Seq_Testing.Nextval进入变量 到目前为止,没有问题。但是,当我添加用户模式名时,Oracle给了我一个错误。 -->从Dual中选择User.Seq_Testing.Nextval进入变量 Oracle给了我错误消息 PLS-00225:子程序或光标引用超出范围 另外,在添加授权和公共同义词后,我会收到相同的错误消息 Grant Select
从Dual中选择Seq_Testing.Nextval进入变量代码>
到目前为止,没有问题。但是,当我添加用户模式名时,Oracle给了我一个错误。
-->从Dual中选择User.Seq_Testing.Nextval进入变量代码>
Oracle给了我错误消息
PLS-00225:子程序或光标引用超出范围
另外,在添加授权和公共同义词后,我会收到相同的错误消息
Grant Select On User.Seq_Testing To User;
Create Public Synonym Seq_Testing For User.Seq_Testing;
请注意,这是一个Oracle 11g数据库
欢迎提出任何意见
温馨问候您并不是在真正添加用户名/架构名:
USER
返回会话用户(登录的用户)的名称,数据类型为VARCHAR2
因此,您可以将其作为函数调用:
select user from dual;
USER
------------------------------
MY_SCHEMA
但不能使用函数在语句中提供。如你所见,如果你这样做
Select User.Seq_Testing.Nextval Into Variable From Dual;
然后你得到
PLS-00225:子程序或光标“用户”参考超出范围
PL/SQL:ORA-02289:序列不存在
PL/SQL:SQL语句被忽略
您可以使用动态SQL指定当前用户的架构:
execute immediate 'Select ' || User || '.Seq_Testing.Nextval From Dual' Into Variable ;
然后在运行时在执行用户的模式中查找该名称的序列;如果不存在,则会出错。如果您总是希望使用由同一个人拥有的相同序列,那么无论是谁执行该序列(这将更正常),您都必须硬编码模式名称:
Select my_schema.Seq_Testing.Nextval Into Variable From Dual;
或者更简单地说:
Variable := my_schema.Seq_Testing.Nextval;
或者只是:
Variable := Seq_Testing.Nextval;
正如您已经看到的,您不需要在自己的模式中的对象前面加上模式名,这样做似乎没有多大好处。如果这是在存储过程或触发器中,那么它也会在过程/触发器所有者的模式中查找序列,而不是在调用用户的模式中。如果你真的想为每个调用者建立一个单独的序列,那么就必须动态地完成,或者他们也必须有自己的过程。那将是。。。不过很不寻常
您的特权和公共同义词语句有相同的问题,尽管它们会出现不同的错误。您只需要(最多!)一个公共同义词,并且可以指定实际的模式名称,如果它是当前模式,则可以省略它
对于您似乎试图将自己对象上的东西授予自己的特权,这也没有意义-您通常会将Select on SEQU Testing授予其他用户
,假设您希望他们能够直接增加,而不仅仅是通过存储过程/触发器,它们不需要额外的权限(除了在过程上执行之外)。您并不是在真正添加用户/架构名称:
USER
返回会话用户(登录的用户)的名称,数据类型为VARCHAR2
因此,您可以将其作为函数调用:
select user from dual;
USER
------------------------------
MY_SCHEMA
但不能使用函数在语句中提供。如你所见,如果你这样做
Select User.Seq_Testing.Nextval Into Variable From Dual;
然后你得到
PLS-00225:子程序或光标“用户”参考超出范围
PL/SQL:ORA-02289:序列不存在
PL/SQL:SQL语句被忽略
您可以使用动态SQL指定当前用户的架构:
execute immediate 'Select ' || User || '.Seq_Testing.Nextval From Dual' Into Variable ;
然后在运行时在执行用户的模式中查找该名称的序列;如果不存在,则会出错。如果您总是希望使用由同一个人拥有的相同序列,那么无论是谁执行该序列(这将更正常),您都必须硬编码模式名称:
Select my_schema.Seq_Testing.Nextval Into Variable From Dual;
或者更简单地说:
Variable := my_schema.Seq_Testing.Nextval;
或者只是:
Variable := Seq_Testing.Nextval;
正如您已经看到的,您不需要在自己的模式中的对象前面加上模式名,这样做似乎没有多大好处。如果这是在存储过程或触发器中,那么它也会在过程/触发器所有者的模式中查找序列,而不是在调用用户的模式中。如果你真的想为每个调用者建立一个单独的序列,那么就必须动态地完成,或者他们也必须有自己的过程。那将是。。。不过很不寻常
您的特权和公共同义词语句有相同的问题,尽管它们会出现不同的错误。您只需要(最多!)一个公共同义词,并且可以指定实际的模式名称,如果它是当前模式,则可以省略它
对于您似乎试图将自己对象上的东西授予自己的特权,这也没有意义-您通常会将Select on SEQU Testing授予其他用户
,假设您希望他们能够直接增加,而不仅仅是通过存储过程/触发器,它们不需要额外的权限(除了在过程中执行之外)。USER
是一个函数,不能将其用作这样的前缀。不过,您可以使用实际的架构名称。但是,如果您在架构中使用它,为什么还要加前缀呢?我已经更改了此帖子的用户和变量。我之所以要使用它,是因为它来自旧代码,我不允许更改。这是否意味着您没有像在问题中所显示的那样使用User
?那你用的是什么?如果您遇到了这个错误,那么这是一个相关的作用域问题-也许您有一个用户名,这会使解析器感到困惑?user
是一个函数,您不能将它用作这样的前缀。不过,您可以使用实际的架构名称。但是,如果您在架构中使用它,为什么还要加前缀呢?我已经更改了此帖子的用户和变量。我之所以要使用它,是因为它来自旧代码,我不允许更改。这是否意味着您没有像在问题中所显示的那样使用User
?那你用的是什么?如果你犯了这个错误,那么这是一个相关的错误