powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / привязка параметров в хранимую процедуру
7 сообщений из 7, страница 1 из 1
привязка параметров в хранимую процедуру
    #34015299
ddocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть, например, запрос, оформленный в виде хранимой процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
q2 = "BEGIN INSERT INTO test (id, name) VALUES (:id, :val); END;";
CallableStatement cstmt = conn.prepareCall(q2);
cstmt.setInt( 1 ,  13 );
cstmt.setString( 2 , "txt txt");
cstmt.executeUpdate();
...
Все работает нормально. Но как привязывать (IN)значения не по порядковому индексу параметра, а по его имени:
Код: plaintext
1.
2.
cstmt.setInt("id",  13 );
cstmt.setString("val", "txt txt");
- выдают "java.sql.SQLException: Incorrectly set or registered parameters."

Код: plaintext
1.
2.
cstmt.setInt(":id",  13 );
cstmt.setString(":val", "txt txt");

- тоже самое.
1. Как это сделать? И для чего вообще тогда существуют <callablestmt>.setXXX с первым параметром - строкой? Разве туда не имя параметра указывается? Ни в спеке, ни в oracle jdbc faq примеров по этому поводу не нашел.

2. Мне нужно назначить параметры на единый pl/sql-ник с несколькими запросами:
Код: plaintext
1.
2.
3.
4.
BEGIN 
DELETE FROM test WHERE id = :id AND val = :val;
INSERT INTO test (id, name) VALUES (:id, :val); 
END;

И что, каждый раз один и тот же параметр по новой через индексы переназначать?
...
Рейтинг: 0 / 0
привязка параметров в хранимую процедуру
    #34015481
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привязка параметров по имени работает в драйверах от 10-ки, но не везде, не во всех случаях. setXXX() с первым параметром-строкой описаны в интерфейсах JDBC, поэтому они есть, но имхо недореализованы. Более того, ораклы лепят свои методы, например, OraclePreparedStatement.setStringAtName().

Примеры есть тут: http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/oracle10g/index.html , например, Named Parameters Sample
...
Рейтинг: 0 / 0
привязка параметров в хранимую процедуру
    #34015531
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ddockerДобрый день!
Есть, например, запрос, оформленный в виде хранимой процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
q2 = "BEGIN INSERT INTO test (id, name) VALUES (:id, :val); END;";
CallableStatement cstmt = conn.prepareCall(q2);
cstmt.setInt( 1 ,  13 );
cstmt.setString( 2 , "txt txt");
cstmt.executeUpdate();
...

Это не ХП. Это анонимный блок PL/SQL.
...
Рейтинг: 0 / 0
привязка параметров в хранимую процедуру
    #34016358
ddocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
Это не ХП. Это анонимный блок PL/SQL.
Да, конечно.

А как кто поступает с этим?
Ориентироваться на jdbc и вынужденно привязывать по номеркам или писать под OracleStatement-ы, а потом глядишь и jdbc поправят?

И еще: действительно ли такие вот анонимные блоки значительно проигрывают по производительности PreparedStatement?
...
Рейтинг: 0 / 0
привязка параметров в хранимую процедуру
    #34016621
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ddocker Timm
Это не ХП. Это анонимный блок PL/SQL.
Да, конечно.

А как кто поступает с этим?
Ориентироваться на jdbc и вынужденно привязывать по номеркам или писать под OracleStatement-ы, а потом глядишь и jdbc поправят?

И еще: действительно ли такие вот анонимные блоки значительно проигрывают по производительности PreparedStatement?
1. Бинд по имени c драйверами 10ки работает только с ХП.
2. Смотря как использовать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DROP TABLE TEST;
CREATE TABLE TEST (ID INT, val VARCHAR2( 30 ));

CREATE OR REPLACE PROCEDURE test_1(p_id INT, p_val VARCHAR2) AS
BEGIN
    INSERT INTO test (id, val) VALUES (p_id, p_val);
END;
/

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
 import  java.sql.*;
 class  test 
{
     public   static   final   int  cnt =  1000 ;
     public   static   void  main(String[] args)  throws  Exception
    {
         Class .forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test", "tim", "t");

        CallableStatement cstmt = conn.prepareCall("BEGIN test_1(?, ?); END;");
         long  t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=cnt; i++)
        {
            cstmt.setInt("p_id", i);
            cstmt.setInt("p_val", i);
            cstmt.executeUpdate();
        }
        System.out.println(System.currentTimeMillis() - t0);

        cstmt = conn.prepareCall("BEGIN test_1(?, ?); END;");
        t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=cnt; i++)
        {
            cstmt.setInt("p_id", i);
            cstmt.setInt("p_val", i);
            cstmt.addBatch();
        }
        cstmt.executeBatch();
        System.out.println(System.currentTimeMillis() - t0);
        
        PreparedStatement pstmt = conn.prepareStatement("insert into test(id, val) values(?, ?)");
        t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=cnt; i++)
        {
            pstmt.setInt( 1 , i);
            pstmt.setInt( 2 , i);
            pstmt.execute();
        }
        System.out.println(System.currentTimeMillis() - t0);
        
        pstmt = conn.prepareStatement("insert into test(id, val) values(?, ?)");
        t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=  10 *cnt; i++)
        {
            pstmt.setInt( 1 , i);
            pstmt.setInt( 2 , i);
            pstmt.addBatch();
        }
        System.out.println(System.currentTimeMillis() - t0);
        conn.close();
    }
}
Код: plaintext
1.
2.
3.
1406
969
718
125
...
Рейтинг: 0 / 0
привязка параметров в хранимую процедуру
    #34016890
ddocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не удивительно что в 5 раз быстрее даже на 10-кратном объёме:
pstmt.executeBatch() после последнего цикла не делается. ;(
...
Рейтинг: 0 / 0
привязка параметров в хранимую процедуру
    #34016931
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ddockerНе удивительно что в 5 раз быстрее даже на 10-кратном объёме:
pstmt.executeBatch() после последнего цикла не делается. ;(
потерялось при копировании.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / привязка параметров в хранимую процедуру
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]