PLSQL 表备注,存储过程里的中文都显示乱码,请问怎么处理?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PLSQL 表备注,存储过程里的中文都显示乱码,请问怎么处理?相关的知识,希望对你有一定的参考价值。
参考技术A 方法/步骤登陆plsql,执行sql语句,输出的中文标题显示成问号????;条件包含中文,则无数据输出
输入sql语句select
*
from
V$NLS_PARAMETERS查看字符集,查看第一行value值是否为简体中文
进入注册表,依次单击HKEY_LOCAL_MACHINE
--->SOFTWARE
--->
ORACLE--->home(小编安装的是Oracle
11g,这里显示成KEY_OraDb11g_home1),找到NLS_LANG,查看数值数据是否为:SIMPLIFIED
CHINESE_CHINA.ZHS16GBK
如果以上设置都没有问题,那就要查看下环境变量的设置,查看是否有变量NLS_LANG,没有则新建该变量
新建变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED
CHINESE_CHINA.ZHS16GBK,确定即可
6
退出plsql,重新登陆plsql。输入sql语句,执行,中文标题终于正常显示,也有数据输出了
如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?
【中文标题】如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?【英文标题】:How to pass list of table names as parameter in stored procedure in Oracle SQL Developer? How to use PLSQL VARRAY or nested table? 【发布时间】:2020-11-14 14:03:00 【问题描述】:我有一个代码,它接受一个表名作为参数,并在该表名上为分区创建子分区。我的表按源系统代码列表进行分区,并且范围按月进行子分区。
问题:如果假设我有可变的表列表并且我想为所有表创建子分区,那么我需要每次修改此过程以传递不同的表列表。 我可以使用 PLSQL VARRAY 或嵌套表来保存我的表列表,并将这个 VARRAY 或嵌套表作为参数传递给下面的过程,并为 VARRAY 或嵌套表所持有的所有表名创建子分区吗?
非常感谢您的帮助。非常感谢!
代码:
CREATE OR REPLACE PROCEDURE execute_subpartition ( table_name IN varchar2)
IS
tbl_nm varchar2(30) := table_name;
sqlstr VARCHAR2(1000);
CURSOR TabSubPartition IS
SELECT TABLE_NAME, PARTITION_NAME
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = tbl_nm
ORDER BY PARTITION_NAME;
BEGIN
FOR aSubPart IN TabSubPartition LOOP
IF TRUNC(LAST_DAY(SYSDATE)) = TRUNC(SYSDATE)
sqlstr := 'ALTER TABLE TUCEL001.' || aSubPart.TABLE_NAME || ' MODIFY PARTITION ' ||
aSubPart.PARTITION_NAME ||' ADD SUBPARTITION ' || aSubPart.PARTITION_NAME || '_' ||
TO_CHAR(TRUNC(LAST_DAY(SYSDATE) + 1), 'MON_YYYY') ||' VALUES LESS THAN (TIMESTAMP ''' ||
TRIM(to_char(add_months((TRUNC(LAST_DAY(SYSDATE))+1), 1), 'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIAN')) || ''')';
dbms_output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;
ELSE
dbms_output.put_line('the condition did not match');
END IF;
END LOOP;
Exception
WHEN OTHERS
THEN
dbms_output.put_line('encountered an error, because the sub-partitions which are being created
already exists');
END;
【问题讨论】:
【参考方案1】:我的 11g 没有启用分区,所以无法演示。
但是,看看这个例子(创建一些表)是否有帮助。您不必声明自己的类型 - sys.odcivarchar2list
应该这样做。使用table
函数读取它并在动态SQL 中使用它的column_value
。
程序:
SQL> create or replace procedure p_test (par_tables in sys.odcivarchar2list) as
2 l_str varchar2(200);
3 begin
4 for cur_r in (select column_value as table_name
5 from table(par_tables)
6 )
7 loop
8 dbms_output.put_line('table name = ' || cur_r.table_name);
9 l_str := 'create table ' || dbms_assert.qualified_sql_name(cur_r.table_name) ||
10 ' (id number,' ||
11 ' name varchar2(20))';
12 execute immediate(l_str);
13 end loop;
14 end;
15 /
Procedure created.
测试:
SQL> exec p_test(sys.odcivarchar2list('tab_a', 'tab_b'));
PL/SQL procedure successfully completed.
SQL> desc tab_a;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(20)
SQL> desc tab_b;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(20)
SQL>
【讨论】:
我无法理解如何使用上述示例作为我的查询的解决方案。 :( 在我上面的过程中,我想传递一个表名列表作为参数,它再次在过程中的 select 语句的 where 子句中处理以获取某些记录。此外,我需要筛选所有给定记录的两列值,并使用这些值创建子分区。 和我一样;您将编写自己的动态 SQL 来完成工作的 分区 部分。我不能,我的数据库不支持分区。除此之外,应该没问题。 很抱歉,我不明白您的问题是什么。我清楚地展示了如何传递表列表以及如何在 WHERE 子句中使用它。你没看到吗?也许你不喜欢它,但这是一个不同的问题。 非常感谢您的上述示例,我能够利用类似的功能并获得所需的结果。除了上面我在存储过程中使用了 pl/sql 嵌套游标 FOR 循环。以上是关于PLSQL 表备注,存储过程里的中文都显示乱码,请问怎么处理?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用plsql导出oracle数据建表语句,存储过程,视图.以及表中数据
oracle数据库中存储过程plsql能查但java查询不到,其他表查询都可以,而且上周该存储过程也是可以的。
如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?