db_dml { -key "" -type "" -where "" -clobs "" -blobs "" -clob_files "" -blob_files "" } sql_or_table argsWhat it does:
Performs a DML statement.Defined in: /web/philip/packages/acs-core/10-database-procs.tcl
Source code:
arg_parser_for_db_dml $args
# Only one of clobs, blobs, clob_files, and blob_files is allowed. Remember which one
# (if any) is provided.
set lob_argc 0
set lob_argv [list]
set command "ns_db dml"
if { ![empty_string_p $clobs] } {
set command "ns_ora clob_dml"
set lob_argv $clobs
incr lob_argc
}
if { ![empty_string_p $blobs] } {
set command "ns_ora blob_dml"
set lob_argv $blobs
incr lob_argc
}
if { ![empty_string_p $clob_files] } {
set command "ns_ora clob_dml_file"
set lob_argv $clob_files
incr lob_argc
}
if { ![empty_string_p $blob_files] } {
set command "ns_ora blob_dml_file"
set lob_argv $blob_files
incr lob_argc
}
if { $lob_argc > 1 } {
error "Only one of -clobs, -blobs, -clob_files, or -blob_files may be specified as an argument to db_dml"
}
if { ![string compare "" $type] } {
# Plain ol' DML/DDL statement.
if { [llength $args] != 0 } {
error "Too many arguments to db_dml: expects only one argument if -type is unspecified"
}
set sql $sql_or_table
} else {
if { [llength $args] != 1 } {
error "Expected two arguments to db_dml"
}
set columns [lindex $args 0]
set names [list]
set values [list]
foreach column $columns {
# Build lists of column names/values.
set name [lindex $column 0]
if { ![string compare $type "update"] && ![string compare $key $name] } {
# If it's an update, don't insert the primary key column! Instead,
# save the value in key_value.
set key_value [lindex $column 1]
} else {
if { ![string compare $type "update"] } {
lappend values "$name = [lindex $column 1]"
} else {
lappend names $name
lappend values [lindex $column 1]
}
}
}
if { ![string compare $type "insert"] } {
# Perform the insert.
if { [string compare "" $where] } {
# A where clause was specified... do an INSERT ... SELECT to handle this
# case.
set sql "insert into ${sql_or_table}([join $names ","])
select [join $values ","] from dual
where $where"
} else {
set sql "insert into ${sql_or_table}([join $names ","]) values([join $values ","])"
}
} elseif { ![string compare $type "update"] } {
# It's an update. Build the where clause.
set where_items [list]
if { [string compare "" $key] } {
if { ![info exists key_value] } {
error "Value for key column ($key_value) is unspecified."
}
lappend where_items "$key = $key_value"
}
if { [string compare "" $where] } {
lappend where_items "($where)"
}
if { [llength $where_items] != 0 } {
set where_clause "where [join $where_items "and"]"
} else {
set where_clause ""
}
set sql "update $sql_or_table set [join $values ", "] $where_clause"
} else {
error "type, if specified, must be either \"insert\" or \"update\""
}
}
db_with_handle db {
eval [concat $command [list $db $sql] $lob_argv]
}