Plsql 在oracle软件包规范中创建类似字典的值集合

Plsql 在oracle软件包规范中创建类似字典的值集合,plsql,Plsql,假设我有一个包规范,它存储常量值,这些常量值在其他包(主要是它们的过程)中被广泛使用——所以像自定义错误消息、特定值,甚至像这样的列表 类型myTableType是VARCHAR2(100)的表; myObj mytype:=新的myTableType('value1','value2') 不过,我现在想给它添加一个完整的“dictionary”结构——在这个包中添加一个键->值对列表 似乎我无法初始化该部分中的记录表,正如这里已经询问的: 链接中提到的对象表似乎也不是我的解决方案。不确定什么是

假设我有一个包规范,它存储常量值,这些常量值在其他包(主要是它们的过程)中被广泛使用——所以像自定义错误消息、特定值,甚至像这样的列表

类型myTableType是VARCHAR2(100)的表;
myObj mytype:=新的myTableType('value1','value2')

不过,我现在想给它添加一个完整的“dictionary”结构——在这个包中添加一个键->值对列表

似乎我无法初始化该部分中的记录表,正如这里已经询问的: 链接中提到的对象表似乎也不是我的解决方案。不确定什么是最好的解决办法


有什么想法吗?

给出了包装规格

CREATE OR REPLACE PACKAGE example IS

   TYPE assoc_array_type IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100);

   g_const_array assoc_array_type;

   PROCEDURE dummy_proc (i_var NUMBER);
END example;
/
您可以按如下方式初始化关联的常量数组

CREATE OR REPLACE PACKAGE BODY example IS

   PROCEDURE dummy_proc (i_var NUMBER) IS
   BEGIN
      dbms_output.put_line(g_const_array('key_1'));
   END dummy_proc;

BEGIN
   g_const_array('key_1') := 'value_1';
   g_const_array('key_2') := 'value_2';
   g_const_array('key_3') := 'value_3';
END example;
/
要进行测试,请编译spec和body,然后调用dummy_proc,它将向控制台打印
value_1
。关联数组也可以根据不同的需要按二进制整数或pls整数进行索引

编辑:第二个包显示您可以引用公共数组并从其他包的初始化中获取值

CREATE OR REPLACE PACKAGE example_2 IS

   PROCEDURE dummy_proc (i_key VARCHAR2);

END example_2;
/

CREATE OR REPLACE PACKAGE BODY example_2 IS

   PROCEDURE dummy_proc (i_key VARCHAR2) IS
   BEGIN
      dbms_output.put_line(example.g_const_array(i_key));
   END dummy_proc;

END example_2;
/

BEGIN
   example_2.dummy_proc('key_1');
END;
/  

给定一个包规范

CREATE OR REPLACE PACKAGE example IS

   TYPE assoc_array_type IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100);

   g_const_array assoc_array_type;

   PROCEDURE dummy_proc (i_var NUMBER);
END example;
/
您可以按如下方式初始化关联的常量数组

CREATE OR REPLACE PACKAGE BODY example IS

   PROCEDURE dummy_proc (i_var NUMBER) IS
   BEGIN
      dbms_output.put_line(g_const_array('key_1'));
   END dummy_proc;

BEGIN
   g_const_array('key_1') := 'value_1';
   g_const_array('key_2') := 'value_2';
   g_const_array('key_3') := 'value_3';
END example;
/
要进行测试,请编译spec和body,然后调用dummy_proc,它将向控制台打印
value_1
。关联数组也可以根据不同的需要按二进制整数或pls整数进行索引

编辑:第二个包显示您可以引用公共数组并从其他包的初始化中获取值

CREATE OR REPLACE PACKAGE example_2 IS

   PROCEDURE dummy_proc (i_key VARCHAR2);

END example_2;
/

CREATE OR REPLACE PACKAGE BODY example_2 IS

   PROCEDURE dummy_proc (i_key VARCHAR2) IS
   BEGIN
      dbms_output.put_line(example.g_const_array(i_key));
   END dummy_proc;

END example_2;
/

BEGIN
   example_2.dummy_proc('key_1');
END;
/  

需要更多的上下文来提供解决方案方面的帮助,但您可能需要查看。这是PL/SQL中的键值对类型,与其他语言中的字典或哈希映射非常类似。如何在所述包块中初始化关联数组?需要更多上下文来提供解决方案的帮助,但您可能需要查看。这是PL/SQL中的键值对类型,非常类似于其他语言中的字典或哈希映射。我如何在所提到的包块中初始化关联数组?好的,我忘了提到一件重要的事情。如果我按照您的方式执行,那么我担心g_const_数组值在其他包中不可见,因为我所阅读的包体是一个范围“私有”的部分。因此,我的包根本没有包体。好吧,我突然想到一个主意——我可以添加一个函数,在某种程度上模仿getter——在包体中创建我想要的东西,如果我将其添加到包规范中,该函数是公共的,然后我可以返回带有该函数的记录表。包体实际上是“私有的”,但是您将初始化与实际变量混淆了。初始化代码在第一次接触包时运行,将值放入公共数组。事实上,它可以被其他软件包使用。哦!现在我明白了。没有注意到包体中的独立开始。很高兴知道包是如何解析的。非常感谢,这确实有帮助:)好的,我忘了提一件重要的事。如果我按照您的方式执行,那么我担心g_const_数组值在其他包中不可见,因为我所阅读的包体是一个范围“私有”的部分。因此,我的包根本没有包体。好吧,我突然想到一个主意——我可以添加一个函数,在某种程度上模仿getter——在包体中创建我想要的东西,如果我将其添加到包规范中,该函数是公共的,然后我可以返回带有该函数的记录表。包体实际上是“私有的”,但是您将初始化与实际变量混淆了。初始化代码在第一次接触包时运行,将值放入公共数组。事实上,它可以被其他软件包使用。哦!现在我明白了。没有注意到包体中的独立开始。很高兴知道包是如何解析的。非常感谢,这确实很有帮助:)