一些 DBMS 具有pi()
给出 π 值的函数。我找不到 Db2 的等效函数。
我想我可以使用radians(180)
,但是有没有更直接的方法呢?
一些 DBMS 具有pi()
给出 π 值的函数。我找不到 Db2 的等效函数。
我想我可以使用radians(180)
,但是有没有更直接的方法呢?
是否可以在 Db2 表中包含日期检查?
我尝试过:
CREATE TABLE customers (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
email VARCHAR(60) NOT NULL UNIQUE,
-- etc
dob date, -- Db2: CHECK (dob < current_timestamp - interval '18 years'), fails
-- etc
);
我已经能够在其他 DBMS 中执行此操作;例如,上面注释掉的代码适用于 PostgreSQL。但是,当我在 Db2 中尝试时,我收到如下消息:
SQL 错误 [42621]:使用“current_date”定义的检查约束或生成的列无效
也许有解决方法?
我尝试创建一个过程来根据列中的最大值调整序列。为了从列中获取最大值并将其存储在变量中,我最终使用了“虚拟”游标。我认为有一种更简单的方法,但我无法让其中任何一个方法起作用。关于如何摆脱游标并仍然能够在 alter 语句中使用最大值,有什么建议吗?
--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE Adjust_Sequence(
IN p_table_schema VARCHAR(128),
IN p_table_name VARCHAR(128),
IN p_column_name VARCHAR(128),
IN p_sequence_name VARCHAR(128)
)
LANGUAGE SQL
BEGIN
DECLARE v_max_value BIGINT DEFAULT 1;
DECLARE v_sql_stmt VARCHAR(1000);
DECLARE cur CURSOR FOR S;
-- Construct SQL to get the max value of the specified column
SET v_sql_stmt = 'SELECT COALESCE(MAX(' || p_column_name || '), 0) + 1 FROM ' || p_table_schema || '.' || p_table_name;
-- Prepare and execute the statement properly
PREPARE S FROM v_sql_stmt;
OPEN cur;
FETCH cur INTO v_max_value;
CLOSE cur;
-- Construct SQL to alter the sequence to restart with the new max value
SET v_sql_stmt = 'ALTER SEQUENCE ' || p_sequence_name || ' RESTART WITH ' || v_max_value;
-- Execute the sequence alteration
EXECUTE IMMEDIATE v_sql_stmt;
END @
--#SET TERMINATOR ;
我有一个修改 SQL 数据的用户定义函数。它插入到一个表中并返回返回行的 ID。尝试像这样使用它
UPDATE table_X SET REV = REVISION(:timestamp, :user) WHERE ...conditions;
DB2 给出了错误:Routine "REDACTED.REVISION" (specific name "REDACTED") is defined with the MODIFIES SQL DATA option, which is not valid in the context where the routine is invoked.
IBM针对此错误的文档明确说明了函数的MODIFIES SQL DATA
使用方法。
这仅仅是 DB2 中的一个错误还是我遗漏了什么?
在 Linux 上的 Db2 v11.5 中,我想创建变量,然后在 SELECT 语句中使用此变量。我不想在数据库上创建过程或函数,我只想从 db2cmd 或某些数据库工具在动态 SQL 中执行此操作。
简化示例:
BEGIN
DECLARE name VARCHAR(10);
SET name = 'John';
SELECT * FROM SYSIBM.SYSDUMMY1 WHERE name = :name;
END;
编辑: 为什么我不想创建存储过程/函数?我每半年对几个数据库的数据库权限/授权进行一次审计,由于严格的安全设置,我没有在某些数据库上创建过程的权限。在大多数情况下,我只能访问系统目录表,这完全足够让我创建审计。我列出数据库用户,然后对于“可疑”用户,我执行完整的权限/权限检查,从系统目录中执行几个 SQL。到目前为止,对于每个用户,我都使用过文本编辑器并使用查找/替换,这是一个不错的解决方案,但变量是更好的解决方案。谢谢!
在 Linux 上的 Db2 v11.5 上,如果我执行命令来检查数据库实例是否启动并正在运行:
ps -e -o command | grep db2sysc
输出为:
db2sysc 0
数字 0 代表什么?我问这个是因为也许在 bash 脚本中用到它会很有用。
我注意到导入截断的数据只会引发警告。T 认为通过处理程序捕获该警告并发出错误信号会很简单,但我似乎无法做到这一点。有什么建议么?
CREATE OR REPLACE PROCEDURE FILE_IMPORT_HANDLER(filename VARCHAR(255), tablename
VARCHAR(255))
LANGUAGE SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '22001'
SIGNAL SQLSTATE '75002'
SET MESSAGE_TEXT = '...';
CALL ADMIN_CMD('import from ' || filename || ' of del insert into ' || tablename);
END @
如果遇到22001我愿意努力失败。从某种意义上说,提高导入过程中数据截断的严重性
在我意识到存在重新验证对象的过程(SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS)之前,我编写了自己的过程。现在,我尝试将其替换为标准的,但似乎对 SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS 的调用破坏了我正在循环的游标。旧程序示例:
db2 -td@ +c "BEGIN FOR v AS c1 CURSOR FOR SELECT SCHEMANAME FROM NYA.VALIDATION_SCHEMAS DO CALL TOOLBOX.COMPILE_SCHEMA2(v.schemaname); END FOR; END @"
DB20000I The SQL command completed successfully.
使用 ADMISN_REVALIDATE_DB_OBJECTS 的示例
db2 "CALL SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS(object_schema=>'TMP')"
Return Status = 0
db2 "CALL SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS(object_schema=>'TMP')"
Return Status = 0
尝试在光标上循环使用它:
db2 -td@ +c "BEGIN FOR v AS c1 CURSOR FOR SELECT SCHEMANAME FROM NYA.VALIDATION_SCHEMAS DO CALL SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS(object_schema=>v.schemaname); END FOR; END @"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0501N The cursor specified in a FETCH statement or CLOSE statement is not
open or a cursor variable in a cursor scalar function reference is not open.
SQLSTATE=24501
请注意,它对硬连接架构没有帮助:
db2 -td@ +c "BEGIN FOR v AS c1 CURSOR FOR SELECT SCHEMANAME FROM NYA.VALIDATION_SCHEMAS DO CALL SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS(object_schema=>'TMP')
[...]
也会产生错误。我尝试了在光标上循环的变体:
BEGIN
DECLARE s VARCHAR(128);
DECLARE v_at_end INTEGER default 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE C1 CURSOR for
SELECT SCHEMANAME FROM NYA.VALIDATION_SCHEMAS;
DECLARE CONTINUE HANDLER FOR not_found SET v_at_end = 1 ;
OPEN C1;
fetch_loop:
LOOP
FETCH FROM C1 INTO s;
IF v_at_end <>0 THEN LEAVE fetch_loop; END IF;
CALL SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS(object_schema=>s);
END LOOP;
CLOSE C1;
END
@
但它也不起作用。任何线索,需要做什么才能在循环中调用 ADMIN_REVALIDATE_DB_OBJECTS ?
在我们的计算机上安装了 Db2 v11.5.8.0 Linux/x86-64。我想安装新的修复程序作为定期更新,特别是部署安全修复程序。
几周前发布了新的修复包 11.5.9.0。但现在我看到累积特殊构建也列在下载 Db2 修复包网页上。查看CSB网页的详细信息,有信息:“CSB是累积的,每个CSB包含先前CSB中提供的所有修复。” 如果我理解正确,CSB 不应安装在 v11.5.9.0 之上,而应安装在以前的 CSB 之上(如果安装在 Db2 服务器上)。它是否正确?
CSB 的首要目的是什么?仅包含安全和故障修复而没有新功能?应用CSB后Db2的发布是什么?
谢谢
在 Red Hat 8.8 上,我安装了 Db2 v11.5.8.0 并且数据库工作正常。
db2prereqcheck
并且满足了所有先决条件。成功的。db2_install
命令安装 Db2。成功的。db2iupdt
。成功的。db2start
出现错误:db2start:加载共享库时出错:libaws-cpp-sdk-transfer.so:无法打开共享对象文件:没有这样的文件或目录看起来有些库丢失了。我尝试在网上搜索,但找不到如何安装该库。任何想法?