AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79529011
Accepted
Ken Kiarie
Ken Kiarie
Asked: 2025-03-23 21:25:10 +0800 CST2025-03-23 21:25:10 +0800 CST 2025-03-23 21:25:10 +0800 CST

为 Apache Derby 设置类路径属性

  • 772

如何设置 Apache 服务器 derby 的类路径属性。我尝试在创建过程并将其作为外部名称链接到 Java 函数时调试此错误:

The class 'C:\Users\Koi\IdeaProjects\Java Finishing Touches\JDBC\src\main\java\MyFirstDatabaseConnection.testProc' does not exist or is inaccessible. This can happen if the class is not public or the derby.database.classpath property is missing or incorrectly defined.

对于 apache derby 过程,这是我定义的外部名称:

CREATE PROCEDURE 
read_e_names 
() PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'C:\Users\Koi\IdeaProjects\Java Finishing Touches\JDBC\src\main\java\MyFirstDatabaseConnection.testProc';
java
  • 1 1 个回答
  • 55 Views

1 个回答

  • Voted
  1. Best Answer
    life888888
    2025-03-25T01:07:09+08:002025-03-25T01:07:09+08:00

    简而言之:

    • 设置CLASSPATH添加到您的过程的 Jar 文件的路径。
    • 设置EXTERNAL NAME为Java包名+类名+方法名:例如:com.example.ReadENamesProcedure.readENames

    项目目录

    创建ST_Derby_Procedure​C:\

    C:\ST_Derby_Procedure
    ├── init.sql
    ├── apache-derby-demodb
    ├── derby-my-demo-procedure
    │   ├── pom.xml
    │   └── src
    │       └── main
    │           └── java
    │               └── com
    │                   └── example
    │                       ├── MyProcedure.java
    │                       └── ReadENamesProcedure.java
    └── demo-java-call-procedure
        ├── pom.xml
        └── src
            └── main
                └── java
                    └── com
                        └── example
                            ├── CallAddNumbersFunction.java
                            └── CallReadENames.java
    

    创建数据库数据目录

    • 打开CMD.exe
    cd C:\ST_Derby_Procedure
    
    mkdir apache-derby-demodb
    

    derby-我的演示程序

    C:\ST_Derby_Procedure
    ├── derby-my-demo-procedure
    │   ├── pom.xml
    │   └── src
    │       └── main
    │           └── java
    │               └── com
    │                   └── example
    │                       ├── MyProcedure.java
    │                       └── ReadENamesProcedure.java
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example</groupId>
        <artifactId>derby-my-demo-procedure</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>derby-my-demo-procedure</name>
        <description>Apache Derby my-demo-procedure</description>
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
        </properties>
    
        <build>
            <finalName>derby-my-demo-procedure</finalName>
        </build>
    
    </project>
    

    我的程序.java

    package com.example;
    
    import java.sql.SQLException;
    
    public class MyProcedure {
    
        public static int addNumbers(int a, int b) throws SQLException {
            return a + b;
        }
        
    }
    

    读取ENames程序.java

    package com.example;
    
    import java.sql.*;
    
    public class ReadENamesProcedure {
    
        public static void readENames(ResultSet[] results) throws SQLException {
    
            Connection conn = DriverManager.getConnection("jdbc:default:connection");
    
            PreparedStatement ps = conn.prepareStatement("SELECT name FROM STUDENTS");
            
            results[0] = ps.executeQuery();
        }
    }
    

    建造

    cd C:\ST_Derby_Procedure\derby-my-demo-procedure
    
    mvn clean package
    

    输出:我们的 procedure.jar

    C:\ST_Derby_Procedure\derby-my-demo-procedure\target\derby-my-demo-procedure.jar
    

    Apace Derby 网络服务器

    对于 Java 17+

    • 浏览器打开https://db.apache.org/derby/releases/release-10_16_1_1.cgi
    • 下载 db-derby-10.16.1.1-bin.zip
    • 解压db-derby-10.16.1.1-bin.zip,得到目录:db-derby-10.16.1.1-bin
    • 将目录:db-derby-10.16.1.1-bin放入C:\TOOLS (完整路径C:\TOOLS\db-derby-10.16.1.1-bin:)

    添加用户环境变量

    • 添加DERBY_HOME,设置C:\TOOLS\db-derby-10.16.1.1-bin
    • 编辑PATH、添加C:\TOOLS\db-derby-10.16.1.1-bin\bin

    在此处输入图片描述

    运行 Derby 网络服务器

    • 将程序 jar 的路径设置为CLASSPATH

    • 将工作目录更改为数据库数据目录(C:\ST_Derby_Procedure\apache-derby-demodb)

    • 打开CMD.exe

    set CLASSPATH=C:\ST_Derby_Procedure\derby-my-demo-procedure\target\derby-my-demo-procedure.jar
    
    cd C:\ST_Derby_Procedure\apache-derby-demodb
    
    startNetworkServer
    

    创建数据库

    • 打开CMD.exe
    set CLASSPATH=C:\ST_Derby_Procedure\derby-my-demo-procedure\target\derby-my-demo-procedure.jar
    
    cd C:\ST_Derby_Procedure
    
    ij
    

    如果您尚未创建数据库,则需要创建一个:

    在 ij 中:

    CONNECT 'jdbc:derby://localhost:1527/demodb;create=true' USER 'demouser' PASSWORD 'Passw0rd!';
    

    如果您已经创建了数据库:

    CONNECT 'jdbc:derby://localhost:1527/demodb' USER 'demouser' PASSWORD 'Passw0rd!';
    

    C:\ST_Derby_Procedure\init.sql

    CREATE TABLE STUDENTS (
        id INT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        age INT,
        grade VARCHAR(10),
        email VARCHAR(100),
        enrollment_date DATE
    );
    
    INSERT INTO STUDENTS (name, age, grade, email, enrollment_date)
    VALUES
    ('Derby Alice', 20, '1', '[email protected]', '2023-01-15'),
    ('Derby Bob', 22, '1', '[email protected]', '2023-02-10'),
    ('Derby Charlie', 21, '2', '[email protected]', '2022-03-12'),
    ('Derby David', 23, '2', '[email protected]', '2022-04-08'),
    ('Derby Eva', 20, '3', '[email protected]', '2021-05-05');
    

    创建表并导入数据

    • 打开CMD.exe
    set CLASSPATH=C:\ST_Derby_Procedure\derby-my-demo-procedure\target\derby-my-demo-procedure.jar
    
    cd C:\ST_Derby_Procedure
    
    ij
    
    • 连接到数据库

    在 中ij运行命令:

    CONNECT 'jdbc:derby://localhost:1527/demodb' USER 'demouser' PASSWORD 'Passw0rd!';
    
    • 在ij,从文件运行 SQL 命令:init.sql
    RUN 'init.sql';
    

    创建过程

    在 中ij运行命令:

    CREATE PROCEDURE READ_E_NAMES() LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA DYNAMIC RESULT SETS 1 EXTERNAL NAME 'com.example.ReadENamesProcedure.readENames';
    

    注意:在 Windows 中,指令必须合并为一行。

    Linux:这个和上面的一样。

    CREATE PROCEDURE READ_E_NAMES()
    LANGUAGE JAVA
    PARAMETER STYLE JAVA
    READS SQL DATA
    DYNAMIC RESULT SETS 1
    EXTERNAL NAME 'com.example.ReadENamesProcedure.readENames';
    

    笔记:

    这里EXTERNAL NAME是 Java 格式,即:

    • package name……class name​method name
    • com.example……ReadENamesProcedure​readENames
    • 'com.example.ReadENamesProcedure.readENames'

    测试程序

    在 ij 中,运行命令:

    CALL READ_E_NAMES();
    

    输出:

    ij> CALL READ_E_NAMES();
    NAME
    ----------------------------------------------------------------------------------------------------
    Derby Alice
    Derby Bob
    Derby Charlie
    Derby David
    Derby Eva
    
    5 rows selected
    

    创建函数

    在 ij 中,运行命令:

    CREATE FUNCTION ADD_NUMBERS(A INT, B INT) RETURNS INT PARAMETER STYLE JAVA LANGUAGE JAVA NO SQL EXTERNAL NAME 'com.example.MyProcedure.addNumbers';
    

    注意:在 Windows 中,指令必须合并为一行。

    Linux:

    CREATE FUNCTION ADD_NUMBERS(A INT, B INT) RETURNS INT
    PARAMETER STYLE JAVA
    LANGUAGE JAVA
    NO SQL
    EXTERNAL NAME 'com.example.MyProcedure.addNumbers';
    

    测试功能

    在 ij 中,运行命令:

    VALUES ADD_NUMBERS(3, 4);
    

    输出:

    ij> VALUES ADD_NUMBERS(3, 4);
    1
    -----------
    7
    
    1 row selected
    

    演示 Java 调用过程

    使用Java调用上面的PROCEDURE和FUNCTION。

    C:\ST_Derby_Procedure
    └── demo-java-call-procedure
        ├── pom.xml
        └── src
            └── main
                └── java
                    └── com
                        └── example
                            ├── CallAddNumbersFunction.java
                            └── CallReadENames.java
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        
        <groupId>com.example</groupId>
        <artifactId>call-myprocedure</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>call-myprocedure</name>
        <description>Call myprocedure</description>
        
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.derby</groupId>
                <artifactId>derbyclient</artifactId>
                <version>10.16.1.1</version>
                </dependency>
        </dependencies>
    
        <build>
            <finalName>app</finalName>
        </build>
    
    </project>
    

    调用ReadENames.java

    package com.example;
    
    import java.sql.*;
    
    public class CallReadENames {
        public static void main(String[] args) {
            String url = "jdbc:derby://localhost:1527/demodb";
            String username = "demouser";
            String password = "Passw0rd!";
    
            try (Connection conn = DriverManager.getConnection(url,username, password);
                 CallableStatement cs = conn.prepareCall("{CALL READ_E_NAMES()}")) {
    
                boolean hasResults = cs.execute();
                while (hasResults) {
                    try (ResultSet rs = cs.getResultSet()) {
                        while (rs.next()) {
                            System.out.println("Name: " + rs.getString(1));
                        }
                    }
                    hasResults = cs.getMoreResults();
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    CallAddNumbers函数.java

    package com.example;
    
    import java.sql.*;
    
    public class CallAddNumbersFunction {
        public static void main(String[] args) {
            String url = "jdbc:derby://localhost:1527/demodb";
            String username = "demouser";
            String password = "Passw0rd!";
                    
            try (Connection conn = DriverManager.getConnection(url, username, password);
                 PreparedStatement ps = conn.prepareStatement("VALUES ADD_NUMBERS(?, ?)")) {
                
                ps.setInt(1, 3);
                ps.setInt(2, 4);
                
                try (ResultSet rs = ps.executeQuery()) {
                    if (rs.next()) {
                        int result = rs.getInt(1);
                        System.out.println("Result: " + result); // output: Result: 7
                    }
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    构建并下载依赖项

    cd C:\ST_Derby_Procedure\demo-java-call-procedure
    
    mvn clean package
    
    mvn dependency:copy-dependencies -DoutputDirectory=target\libs
    

    运行—调用 PROCEDURE

    cd C:\ST_Derby_Procedure\demo-java-call-procedure
    
    java -cp "target\libs\*;target\app.jar" com.example.CallReadENames
    

    获取输出:

    C:\ST_Derby_Procedure\demo-java-call-procedure>java -cp "target\libs\*;target\app.jar" com.example.CallReadENames
    
    Name: Derby Alice
    Name: Derby Bob
    Name: Derby Charlie
    Name: Derby David
    Name: Derby Eva
    

    运行——调用函数

    cd C:\ST_Derby_Procedure\demo-java-call-procedure
    
    java -cp "target\libs\*;target\app.jar" com.example.CallAddNumbersFunction
    

    获取输出

    C:\ST_Derby_Procedure\demo-java-call-procedure>java -cp "target\libs\*;target\app.jar" com.example.CallAddNumbersFunction
    
    Result: 7
    
    • 2

相关问题

  • Lock Condition.notify 抛出 java.lang.IllegalMonitorStateException

  • 多对一微服务响应未出现在邮递员中

  • 自定义 SpringBoot Bean 验证

  • Java 套接字是 FIFO 的吗?

  • 为什么不可能/不鼓励在服务器端定义请求超时?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve