重新编译PLSQL中无效对象或指定对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重新编译PLSQL中无效对象或指定对象相关的知识,希望对你有一定的参考价值。

参考技术A Oracle   Tips   Tricks   &   Scripts       Topic:   Compiling   Invalid   Objects:         Oracle i   and   Oracle i   provides   a   script   called   utlrp sql   located   in   $ORACLE_HOME/rdbms/admin   which   can   be   used   anytime   to   repile   all   exisiting   PL/SQL   modules   (procedure   functions packages triggers   types   and   views)   in   a   database 编译无效的对象   $ORACLE_HOME/rdbms/admin/utlrp sql    或者 编译指定的对象   过程     alter   procedure   procedure_name   pile;     函数     alter   function   function_name   pile;     包     alter   package   package_name   pile;     包体:     alter   package   package_name   pile   body;       lishixinzhi/Article/program/Oracle/201311/16966

在 plsql 可变数组中使用对象

【中文标题】在 plsql 可变数组中使用对象【英文标题】:using objects in plsql varray 【发布时间】:2016-03-29 15:44:46 【问题描述】:

我正在尝试使用 sql developer 在 pl/sql 中创建一个对象。我只是在弄乱基础知识以掌握它。一直报错

对变量“I”的无效引用

SET serveroutput ON


create or replace type conditions as object
(var_name varcher (100) ,
extract_method varchar(100),
default_value varchar (100),
idList varchar (100));


   DECLARE
condition conditions;
TYPE namesarray IS VARRAY(1) OF conditions; 
names namesarray := namesarray();--figure out why this is.
BEGIN
 condition := conditions('a', 'b', 'c', 'd');
 names.extend;
  names(names.last):= condition;
 FOR i IN names.FIRST .. names.LAST
  LOOP
     DBMS_OUTPUT.PUT_line(i.idList);
    END LOOP;
end;

我怎样才能让它工作?

【问题讨论】:

cou 试图达到什么目的?你除了什么? 您使用的是什么版本的 oracle DB? 我并不想看到如何在 plsql 中使用 varray 和访问对象,我想我正在使用 oracle 10g,尽管我很确定。无论哪种方式,您的解决方案都对我有用,非常感谢。 【参考方案1】:

    尝试使用数据类型 VARCHAR2 而不是 VARCHAR 见:What is the difference between varchar and varchar2?

    FOR..LOOP 隐式迭代变量 I,在这种情况下,仅包含集合的当前索引。 事实上,你应该使用这个变量作为你的集合的索引。

请考虑以下方法:

SET serveroutput ON;

--Use VARCHAR2 instead of VARCHAR
CREATE OR REPLACE type conditions
AS object
  (
    var_name varchar2(100),
    extract_method VARCHAR2(100),
    default_value  VARCHAR2(100),
    idList         VARCHAR2(100)
  ) ;
/


DECLARE
  condition conditions;
  TYPE namesarray IS VARRAY(1) OF conditions;
  names namesarray := namesarray() ;--figure out why this is.
BEGIN
  condition := conditions('a', 'b', 'c', 'd') ;
  names.extend;
  names(names.last) := condition;
  FOR i IN names.FIRST .. names.LAST
  LOOP
    DBMS_OUTPUT.PUT_line(names(i) .idList); -- use I as the index for your collection
  END LOOP;
END;
/

输出:

d

【讨论】:

【参考方案2】:

如图所示,VARRAY 可以有另一种选择。这里也可以使用 TABLE 类型。所有集合类型的区别在https://community.oracle.com/thread/457834?start=0&tstart=0

希望这会有所帮助。

SET serveroutput ON;
DECLARE
TYPE namesarray
IS
  TABLE OF conditions;
  names namesarray := namesarray() ;--NULL Constructor
BEGIN
  names:=namesarray(conditions('a', 'b', 'c', 'd'));
  FOR i IN names.FIRST .. names.LAST
  LOOP
    DBMS_OUTPUT.PUT_line(names(i).idList); -- use I as the index for your collection
  END LOOP;
END;

【讨论】:

以上是关于重新编译PLSQL中无效对象或指定对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 10g DB 中重新编译 SYS 用户中的无效 Java 类对象?

转://oracle 重新编译用户无效对象

plsql导入dmp文件时:IMP-00041:警告:创建的对象有编译警告

在oracle中重新编译时对象何时锁定

DataGrip - 编译无效对象 (Oracle)

查看package编译时的错误信息及重新编译