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
?那你用的是什么?如果你犯了这个错误,那么这是一个相关的错误