* [Babel] How to pass variables to SQL blocks?
@ 2010-11-29 16:07 Sébastien Vauban
2010-12-01 2:34 ` Eric Schulte
0 siblings, 1 reply; 6+ messages in thread
From: Sébastien Vauban @ 2010-11-29 16:07 UTC (permalink / raw)
To: emacs-orgmode-mXXj517/zsQ
#+TITLE: How to pass variables to SQL code blocks?
#+DATE: 2010-11-29
#+LANGUAGE: en
* Abstract
I'm trying to abstract similar blocks of SQL code, making use of variables
passed to blocks. Though, I can't get any var passed to the SQL block --
maybe my mistake!
While doing this exercise:
- I tried an alternative way using Noweb syntax -- but this only works for one
instantiation of the parameters --, and
- I found that no warning are emitted if referring to inexistent blocks.
* Using vars
Using this table of parameters,
#+results: param
| table | valueTable0 |
| column | valueColumn0 |
| type | valueType0 |
| nullability | valueNullability0 |
I want to apply the values onto the following chunk of code:
#+srcname: add-column-in-table-0
#+begin_src sql :var @table=param[0,1] :var @column=param[1,1] :var @type=param[2,1] :var @nullability=param[3,1]
-- add column `@column' (if column does not exist yet)
IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '@table'
AND COLUMN_NAME = '@column')
BEGIN
ALTER TABLE @table
ADD @column @type @nullability
END
#+end_src
* Using Noweb
Using Noweb, I can pass values to some variables, doing this:
#+srcname: table
#+begin_src sql
valueTable1
#+end_src
#+srcname: column
#+begin_src sql
valueColumn1
#+end_src
#+srcname: type
#+begin_src sql
valueType1
#+end_src
#+srcname: nullability
#+begin_src sql
valueNullability1
#+end_src
It works:
#+srcname: add-column-in-table-1
#+begin_src sql :noweb yes
-- add column `<<column>>' (if column does not exist yet)
IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<<table>>'
AND COLUMN_NAME = '<<column>>')
BEGIN
ALTER TABLE <<table>>
ADD <<column>> <<type>> <<nullability>>
END
#+end_src
but *only once*, as I can't overwrite the value of the 4 variables...
#+srcname: table
#+begin_src sql
valueTable2
#+end_src
#+srcname: column
#+begin_src sql
valueColumn2
#+end_src
#+srcname: type
#+begin_src sql
valueType2
#+end_src
#+srcname: nullability
#+begin_src sql
valueNullability2
#+end_src
The above chunks of code (with *new values*) were silently ignored, as you can
see when exporting this code, which should add another column in another
table:
#+srcname: add-column-in-table-2
#+begin_src sql :noweb yes
<<add-column-in-table-1>>
#+end_src
* No warning if block does not exist
Please note that inexistent references are ignored, without further notice.
That's the case for such a block (where I forgot the number suffix):
#+srcname: contains-inexistent-ref
#+begin_src sql :noweb yes
<<add-column-in-table>>
#+end_src
Best regards,
Seb
--
Sébastien Vauban
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode-mXXj517/zsQ@public.gmane.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Babel] How to pass variables to SQL blocks?
2010-11-29 16:07 [Babel] How to pass variables to SQL blocks? Sébastien Vauban
@ 2010-12-01 2:34 ` Eric Schulte
2010-12-01 10:35 ` Sébastien Vauban
0 siblings, 1 reply; 6+ messages in thread
From: Eric Schulte @ 2010-12-01 2:34 UTC (permalink / raw)
To: Sébastien Vauban; +Cc: emacs-orgmode
Hi Seb,
Babel's sql support did not have any variable handling. I just copied
over the variable support from ob-sqlite to ob-sql, so the following
should now work (notice: my code block is different from yours)
** sql variables
#+results: sql-param
| table | valueTable0 |
| column | valueColumn0 |
| type | valueType0 |
| nullability | valueNullability0 |
I want to apply the values onto the following chunk of code:
#+srcname: add-column-in-table-0
#+begin_src sql :var table=sql-param[0,1] :var column=sql-param[1,1] :var type=sql-param[2,1] :var nullability=sql-param[3,1]
-- add column `@column' (if column does not exist yet)
IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '@table'
AND COLUMN_NAME = '@column')
BEGIN
ALTER TABLE $table
ADD $column $type @nullability
END
#+end_src
results in the following code block expansion (C-c C-v v)
#+begin_src sql
-- add column `@column' (if column does not exist yet)
IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '@table'
AND COLUMN_NAME = '@column')
BEGIN
ALTER TABLE valueTable0
ADD valueColumn0 valueType0 @nullability
END
#+end_src
-- Eric
Sébastien Vauban <wxhgmqzgwmuf@spammotel.com> writes:
> #+TITLE: How to pass variables to SQL code blocks?
> #+DATE: 2010-11-29
> #+LANGUAGE: en
>
> * Abstract
>
> I'm trying to abstract similar blocks of SQL code, making use of variables
> passed to blocks. Though, I can't get any var passed to the SQL block --
> maybe my mistake!
>
> While doing this exercise:
>
> - I tried an alternative way using Noweb syntax -- but this only works for one
> instantiation of the parameters --, and
>
> - I found that no warning are emitted if referring to inexistent blocks.
>
> * Using vars
>
> Using this table of parameters,
>
> #+results: param
> | table | valueTable0 |
> | column | valueColumn0 |
> | type | valueType0 |
> | nullability | valueNullability0 |
>
> I want to apply the values onto the following chunk of code:
>
> #+srcname: add-column-in-table-0
> #+begin_src sql :var @table=param[0,1] :var @column=param[1,1] :var @type=param[2,1] :var @nullability=param[3,1]
> -- add column `@column' (if column does not exist yet)
> IF NOT EXISTS (SELECT *
> FROM INFORMATION_SCHEMA.COLUMNS
> WHERE TABLE_NAME = '@table'
> AND COLUMN_NAME = '@column')
> BEGIN
> ALTER TABLE @table
> ADD @column @type @nullability
> END
> #+end_src
>
> * Using Noweb
>
> Using Noweb, I can pass values to some variables, doing this:
>
> #+srcname: table
> #+begin_src sql
> valueTable1
> #+end_src
>
> #+srcname: column
> #+begin_src sql
> valueColumn1
> #+end_src
>
> #+srcname: type
> #+begin_src sql
> valueType1
> #+end_src
>
> #+srcname: nullability
> #+begin_src sql
> valueNullability1
> #+end_src
>
> It works:
>
> #+srcname: add-column-in-table-1
> #+begin_src sql :noweb yes
> -- add column `<<column>>' (if column does not exist yet)
> IF NOT EXISTS (SELECT *
> FROM INFORMATION_SCHEMA.COLUMNS
> WHERE TABLE_NAME = '<<table>>'
> AND COLUMN_NAME = '<<column>>')
> BEGIN
> ALTER TABLE <<table>>
> ADD <<column>> <<type>> <<nullability>>
> END
> #+end_src
>
> but *only once*, as I can't overwrite the value of the 4 variables...
>
> #+srcname: table
> #+begin_src sql
> valueTable2
> #+end_src
>
> #+srcname: column
> #+begin_src sql
> valueColumn2
> #+end_src
>
> #+srcname: type
> #+begin_src sql
> valueType2
> #+end_src
>
> #+srcname: nullability
> #+begin_src sql
> valueNullability2
> #+end_src
>
> The above chunks of code (with *new values*) were silently ignored, as you can
> see when exporting this code, which should add another column in another
> table:
>
> #+srcname: add-column-in-table-2
> #+begin_src sql :noweb yes
> <<add-column-in-table-1>>
> #+end_src
>
> * No warning if block does not exist
>
> Please note that inexistent references are ignored, without further notice.
> That's the case for such a block (where I forgot the number suffix):
>
> #+srcname: contains-inexistent-ref
> #+begin_src sql :noweb yes
> <<add-column-in-table>>
> #+end_src
>
> Best regards,
> Seb
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Babel] How to pass variables to SQL blocks?
2010-12-01 2:34 ` Eric Schulte
@ 2010-12-01 10:35 ` Sébastien Vauban
2010-12-13 19:53 ` Eric Schulte
0 siblings, 1 reply; 6+ messages in thread
From: Sébastien Vauban @ 2010-12-01 10:35 UTC (permalink / raw)
To: emacs-orgmode-mXXj517/zsQ
Hi Eric,
"Eric Schulte" wrote:
> Sébastien Vauban <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:
>
> Babel's sql support did not have any variable handling. I just copied over
> the variable support from ob-sqlite to ob-sql, so the following should now
> work (notice: my code block is different from yours)
>
> ** sql variables
> #+results: sql-param
> | table | valueTable0 |
> | column | valueColumn0 |
> | type | valueType0 |
> | nullability | valueNullability0 |
>
> I want to apply the values onto the following chunk of code:
>
> #+srcname: add-column-in-table-0
> #+begin_src sql :var table=sql-param[0,1] :var column=sql-param[1,1] :var type=sql-param[2,1] :var nullability=sql-param[3,1]
> -- add column `@column' (if column does not exist yet)
> IF NOT EXISTS (SELECT *
> FROM INFORMATION_SCHEMA.COLUMNS
> WHERE TABLE_NAME = '@table'
> AND COLUMN_NAME = '@column')
> BEGIN
> ALTER TABLE $table
> ADD $column $type @nullability
> END
> #+end_src
>
> results in the following code block expansion (C-c C-v v)
> #+begin_src sql
> -- add column `@column' (if column does not exist yet)
> IF NOT EXISTS (SELECT *
> FROM INFORMATION_SCHEMA.COLUMNS
> WHERE TABLE_NAME = '@table'
> AND COLUMN_NAME = '@column')
> BEGIN
> ALTER TABLE valueTable0
> ADD valueColumn0 valueType0 @nullability
> END
> #+end_src
For your information, this was the intended code snippet:
#+srcname: add-column-in-table-0
#+begin_src sql :var table=sql-param[0,1] :var column=sql-param[1,1] :var type=sql-param[2,1] :var nullability=sql-param[3,1] :tangle yes
-- add column `$column' (if column does not exist yet)
IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '$table'
AND COLUMN_NAME = '$column')
BEGIN
ALTER TABLE $table
ADD $column $type $nullability
END
#+end_src
(I thought this feature would be implemented using "real" SQL vars, hence my @
prefix. But viewing the code shows the replacement is made outside of the SQL
snippet's knowledge.)
Tested. Works as expected... Thanks a lot!
Maybe the following should be put on some TODO list, even if not urgent?
>> * No warning if block does not exist
>>
>> Please note that inexistent references are ignored, without further notice.
>> That's the case for such a block (where I forgot the number suffix):
>>
>> #+srcname: contains-inexistent-ref
>> #+begin_src sql :noweb yes
>> <<add-column-in-table>>
>> #+end_src
Thanks.
Best regards,
Seb
--
Sébastien Vauban
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode-mXXj517/zsQ@public.gmane.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: [Babel] How to pass variables to SQL blocks?
2010-12-01 10:35 ` Sébastien Vauban
@ 2010-12-13 19:53 ` Eric Schulte
2010-12-13 21:23 ` Sébastien Vauban
0 siblings, 1 reply; 6+ messages in thread
From: Eric Schulte @ 2010-12-13 19:53 UTC (permalink / raw)
To: Sébastien Vauban; +Cc: emacs-orgmode
Sébastien Vauban <wxhgmqzgwmuf@spammotel.com> writes:
>
> (I thought this feature would be implemented using "real" SQL vars, hence my @
> prefix. But viewing the code shows the replacement is made outside of the SQL
> snippet's knowledge.)
>
I agree that using real SQL variables would be preferable. If you want
to submit a patch to this effect I would be happy to review it and apply.
>
> Tested. Works as expected... Thanks a lot!
>
>
> Maybe the following should be put on some TODO list, even if not urgent?
>
>>> * No warning if block does not exist
>>>
>>> Please note that inexistent references are ignored, without further notice.
>>> That's the case for such a block (where I forgot the number suffix):
>>>
>>> #+srcname: contains-inexistent-ref
>>> #+begin_src sql :noweb yes
>>> <<add-column-in-table>>
>>> #+end_src
>
The lack of notice (or error) was originally intentional. The logic
being that there may be languages in which <<something>> constructs are
part of the language syntax, and in those languages Org-mode should
ignore such constructs unless the "something" contained in the <<>>'s is
actually the name of a code block.
It may make sense to revisit this design decision.
Best -- Eric
>
> Thanks.
>
> Best regards,
> Seb
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Babel] How to pass variables to SQL blocks?
2010-12-13 19:53 ` Eric Schulte
@ 2010-12-13 21:23 ` Sébastien Vauban
2010-12-13 22:06 ` Eric Schulte
0 siblings, 1 reply; 6+ messages in thread
From: Sébastien Vauban @ 2010-12-13 21:23 UTC (permalink / raw)
To: emacs-orgmode-mXXj517/zsQ
Hi Eric,
"Eric Schulte" wrote:
> Sébastien Vauban <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:
>> (I thought this feature would be implemented using "real" SQL vars, hence my @
>> prefix. But viewing the code shows the replacement is made outside of the SQL
>> snippet's knowledge.)
>
> I agree that using real SQL variables would be preferable. If you want
> to submit a patch to this effect I would be happy to review it and apply.
I'll give a shot -- not in the really short term, though. Which example should
I look at? shell?
>> Maybe the following should be put on some TODO list, even if not urgent?
>>
>>>> * No warning if block does not exist
>>>>
>>>> Please note that inexistent references are ignored, without further
>>>> notice. That's the case for such a block (where I forgot the number
>>>> suffix):
>>>>
>>>> #+srcname: contains-inexistent-ref
>>>> #+begin_src sql :noweb yes
>>>> <<add-column-in-table>>
>>>> #+end_src
>
> The lack of notice (or error) was originally intentional. The logic
> being that there may be languages in which <<something>> constructs are
> part of the language syntax, and in those languages Org-mode should
> ignore such constructs unless the "something" contained in the <<>>'s is
> actually the name of a code block.
>
> It may make sense to revisit this design decision.
IMHO, it should, yes. Because a typo is so easy, and the results can be very
different then, from what's expected... OK, there is always a preview mode,
but an alert is better (for me).
Maybe adding an option for those languages, that would suppress such warnings?
Re helper functions for such named code blocks, do you have an idea what I
should do to have the IMenu index of code blocks working? See previous thread
[[http://mid.gmane.org/808w09foxd.fsf%40missioncriticalit.com][Re: imenu
support for babel blocks]].
Thanks for any hint!
Best regards,
Seb
--
Sébastien Vauban
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode-mXXj517/zsQ@public.gmane.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: [Babel] How to pass variables to SQL blocks?
2010-12-13 21:23 ` Sébastien Vauban
@ 2010-12-13 22:06 ` Eric Schulte
0 siblings, 0 replies; 6+ messages in thread
From: Eric Schulte @ 2010-12-13 22:06 UTC (permalink / raw)
To: Sébastien Vauban; +Cc: emacs-orgmode
Sébastien Vauban <wxhgmqzgwmuf@spammotel.com> writes:
> Hi Eric,
>
> "Eric Schulte" wrote:
>> Sébastien Vauban <wxhgmqzgwmuf@spammotel.com> writes:
>>> (I thought this feature would be implemented using "real" SQL vars, hence my @
>>> prefix. But viewing the code shows the replacement is made outside of the SQL
>>> snippet's knowledge.)
>>
>> I agree that using real SQL variables would be preferable. If you want
>> to submit a patch to this effect I would be happy to review it and apply.
>
> I'll give a shot -- not in the really short term, though. Which example should
> I look at? shell?
>
great, and please no rush.
shell actually has rather sophisticated variable passing, maybe sqlite
and gnuplot would provide examples more similar to sql.
>
>
>>> Maybe the following should be put on some TODO list, even if not urgent?
>>>
>>>>> * No warning if block does not exist
>>>>>
>>>>> Please note that inexistent references are ignored, without further
>>>>> notice. That's the case for such a block (where I forgot the number
>>>>> suffix):
>>>>>
>>>>> #+srcname: contains-inexistent-ref
>>>>> #+begin_src sql :noweb yes
>>>>> <<add-column-in-table>>
>>>>> #+end_src
>>
>> The lack of notice (or error) was originally intentional. The logic
>> being that there may be languages in which <<something>> constructs are
>> part of the language syntax, and in those languages Org-mode should
>> ignore such constructs unless the "something" contained in the <<>>'s is
>> actually the name of a code block.
>>
>> It may make sense to revisit this design decision.
>
> IMHO, it should, yes. Because a typo is so easy, and the results can be very
> different then, from what's expected... OK, there is always a preview mode,
> but an alert is better (for me).
>
> Maybe adding an option for those languages, that would suppress such warnings?
>
That may be the best idea, once again a header argument may be the most
flexible solution.
>
> Re helper functions for such named code blocks, do you have an idea what I
> should do to have the IMenu index of code blocks working? See previous thread
> [[http://mid.gmane.org/808w09foxd.fsf%40missioncriticalit.com][Re: imenu
> support for babel blocks]].
>
I don't have any experience with IMenu support, however to map over all
code blocks in a file extracting information I would suggest using the
org-babel-map-src-blocks macro.
Cheers -- Eric
>
> Thanks for any hint!
>
> Best regards,
> Seb
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-12-13 22:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-29 16:07 [Babel] How to pass variables to SQL blocks? Sébastien Vauban
2010-12-01 2:34 ` Eric Schulte
2010-12-01 10:35 ` Sébastien Vauban
2010-12-13 19:53 ` Eric Schulte
2010-12-13 21:23 ` Sébastien Vauban
2010-12-13 22:06 ` Eric Schulte
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).