【问题标题】:PLS-00302: Telling me my stored procedure isn't declaredPLS-00302:告诉我我的存储过程没有声明
【发布时间】:2010-05-14 13:48:20
【问题描述】:

这是堆栈中发生错误的位置:

public static IKSList<DataParameter> Search(int categoryID, int departmentID, string title)
        {
            Database db = new Database(DatabaseConfig.CommonConnString, DatabaseConfig.CommonSchemaOwner, "pkg_data_params_new", "spdata_params_search");
            db.AddParameter("category_id", categoryID);
            db.AddParameter("department_id", departmentID);
            db.AddParameter("title", title, title.Length);

            DataView temp = db.Execute_DataView();

            IKSList<DataParameter> dps = new IKSList<DataParameter>();

            foreach (DataRow dr in temp.Table.Rows)
            {
                DataParameter dp = new DataParameter();
                dp.Load(dr);
                dps.Add(dp);
            }

            return dps;
        }

这是错误文本:

ORA-06550: line 1, column 38:
PLS-00302: component 'SPDATA_PARAMS_SEARCH' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.Data.OracleClient.OracleException: ORA-06550:第 1 行,第 38 列:PLS-00302:组件 'SPDATA_PARAMS_SEARCH' 必须声明 ORA-06550:第 1 行,第 7 列: PL/SQL:语句被忽略

来源错误:

Line 161:            db.AddParameter("title", title, title.Length);
Line 162:
Line 163:            DataView temp = db.Execute_DataView();
Line 164:
Line 165:            IKSList<DataParameter> dps = new IKSList<DataParameter>();

我的 web.config 指向正确的位置和所有内容,所以我不知道这是从哪里来的。

【问题讨论】:

  • 您确定您的应用以有权访问 proc 的用户身份连接吗?
  • 我猜“spdata_params_search”应该是大写的。

标签: c# asp.net oracle plsql ora-06550


【解决方案1】:

首先确保调用过程的用户对该过程有执行权限,其次确保调用过程的用户可以直接使用schemaname.procedurename或synonymname.procedure名称看​​到该过程,同义词可以是无论是公共的还是私人的。

希望对你有帮助

【讨论】:

    【解决方案2】:

    janbo 的回答很到位,给他点个赞吧。这是一个脚本,可放入您的数据库部署中,以确保不会再次发生这种情况:

    sqlplus @CreateSynonyms.sql

    -- CreateSynonyms.sql : Creates synonyms on XYZ_USER for all packages that don't already have synonyms
    
    spool CreateSynonyms.log
    
    DECLARE
      owner        VARCHAR2(20) := 'XYZ';
      currentUser  VARCHAR2(20);
      executeLine  VARCHAR2(200);
    BEGIN
      -- Get the user we're currently executing as
      SELECT sys_context('USERENV', 'SESSION_USER') INTO currentUser FROM dual;
    
      FOR x IN (SELECT p.table_name FROM user_tab_privs p
                  WHERE p.owner = owner
                    AND p.privilege = 'EXECUTE'
                    AND p.table_name NOT IN (
                      SELECT table_name FROM user_synonyms
                        WHERE table_owner = owner
                    )
                ) LOOP
        executeLine := 'CREATE OR REPLACE SYNONYM ' || x.table_name || ' FOR ' || owner || '.' || x.table_name;
        DBMS_OUTPUT.PUT_LINE(executeLine);
        EXECUTE IMMEDIATE executeLine;
      END LOOP;
    END;
    /   
    spool off
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多